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. –
- 1. Können Threads denselben Client-Socket verwenden?
- 2. Ab zwei Threads mit Endlosschleifen gleichzeitig
- 3. mehrere Threads, die auf denselben Boolean schreiben
- 4. 2 Threads gleichzeitig ausführen
- 5. können wir laufen zwei Applets gleichzeitig
- 6. Sie können zwei FlowDocuments gleichzeitig durchsuchen?
- 7. Können zwei Anwendungen denselben WCF NetTcpBinding-Anschluss verwenden, wenn sie unterschiedliche Endpunktadressen verwenden?
- 8. Warum kann ich zwei Threads, die denselben Socket in Java enthalten, nicht verwenden?
- 9. Mehrere Threads gleichzeitig in Java ausführen
- 10. Können Sie zwei Variablen gleichzeitig in R zuweisen?
- 11. Hibernate Distributed Cache - können mehrere Anwendungen denselben Cache verwenden?
- 12. JEditorPane eingebetteten Bilder können nicht
- 13. spielen zwei Videos gleichzeitig
- 14. Java (Swing) - Ziehen Sie zwei Fenster gleichzeitig
- 15. Können zwei oder mehr Personen gleichzeitig ein Excel-Dokument bearbeiten?
- 16. Wie können zwei jQuery-Animationen gleichzeitig ausgeführt werden?
- 17. Können zwei verschiedene Chef-Clients gleichzeitig auf demselben Host arbeiten?
- 18. Verwenden von zwei eingebetteten Schriftarten in einer Zeichenfolge
- 19. IIS sendet nicht zwei Antworten gleichzeitig an denselben Client (nur für ASP)
- 20. Verwenden eines eingebetteten OSGi-Containers
- 21. javaFX, zwei MausEreignisse gleichzeitig
- 22. Java - Können zwei Threads auf der Clientseite den gleichen Eingabestream vom Server verwenden?
- 23. Feder StateMachine für mehrere Threads gleichzeitig
- 24. Können Sie das Sperren vermeiden, indem Sie sicherstellen, dass mehrere Threads nicht auf denselben Speicher zugreifen?
- 25. ArrayList über zwei Threads synchronisieren
- 26. Zwei HttpHandlers, die denselben Dateityp behandeln
- 27. Synchronisieren von zwei Threads
- 28. Synchronisation von zwei Threads
- 29. -Konsole mit zwei Threads
- 30. Warum laufen und bewegen sich zwei Cursor gleichzeitig in einer eingebetteten Anwendung?
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