Der Titel hat es, aber hier sind einige Ausführungen. Angenommen, der Haupt-Thread erzeugt einen anderen Thread, in dem Code in den Python-Interpreter geladen wird, und dann wird ein anderer Thread aufgerufen, der über die gleiche Python-Schnittstelle mehr Code ausführt (über PyImport oder PyRun). Ist ein solches Szenario machbar?Können zwei Threads denselben eingebetteten Python-Interpreter gleichzeitig verwenden?
Antwort
Wenn ich folge, was Sie fragen, dann können Sie dies tun, aber der Python-Interpreter selbst ist nicht vollständig Thread-sicher. Um dies zu umgehen, müssen Sie sicherstellen, dass jeder Thread die GIL des Interpreters vor dem Aufruf von Python-Code erhält und anschließend wieder freigibt. dh Jeder Thread die folgenden bei der Ausführung Python-Code tun muss:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
// Do any needed Python API operations, execute python code
// Release the GIL. No Python API allowed beyond this point.
PyGILState_Release(gstate);
Auch sollten Sie die folgenden nach dem Start der Python-Interpreter tun Threads, um sicherzustellen,/GIL richtig initialisiert:
if (! PyEval_ThreadsInitialized()) {
PyEval_InitThreads();
}
Siehe Non Python Created Threads für mehr Infos dazu.
Wie in den Kommentaren erwähnt, ist es erwähnenswert, dass dies nur Serialisierung des Zugriffs auf den Interpreter ist, aber es ist das Beste, was Sie tun können, vorausgesetzt Sie verwenden die CPython-Implementierung von Python.
Bist du sicher, Epic? Es sieht für mich so aus, als ob Sie (bestenfalls ...) * die Verwendung einer einzigen Interpreterinstanz durch den Thread serialisieren. Es scheint mir, dass das OP möchte, dass jeder (C++) Thread seine eigene Python-Interpreter-Instanz hat und beide parallel laufen können, wobei das Threading von C++ und nicht von Python ausgeführt wird. Oder lese ich die Absicht des OP falsch? –
@MikeRobinson Ich dachte, er wollte zwei Threads teilen den gleichen Interpreter. – mshildt
Ja, und obwohl die "Threads" von Python "nur" eine Art "Thread" sind (weil Python natürlich ein Interpreter ist ...), denke ich irgendwie, dass ich meinen Threading in Python-Code schreiben würde. Wir wissen, dass Python * seine * Version von Threading korrekt verwaltet. –
Sie möchten zwei Threads, die denselben eingebetteten Interpreter verwenden, oder? – mshildt
@epicbrew yep, derselbe Interpreter, beide Threads haben Zugriff auf den gleichen Speicher – user3496846