
Ich kämpfe weiter gegen die Windmühlen des Fadenwesens. Ich habe jetzt eine Lösung, die ich den Experten gerne zur Begutachtung vorlegen möchte. Sie basiert auf mehr-oder-minder undokumentierten Funktionen; die einzige Info dazu stammt aus PEP 311, diese ist aber meines Erachtens unvollständig (denn siehe da der untere Teil im Mainthread). Folgendes ist die Ausgangssituation: - Es gibt einen Mainthread, der den Interpreter hochzieht (Py_Initialize()). - Es gibt viele bunte Threads, die auf den Interpreter zugreifen wollen. Lösung (Codeauszug): 1) Im Mainthread am Anfang: Py_Initialize(); // keine Ahnung warum, aber das muß so sein: PyEval_InitThreads(); m_pyThreadState = PyThreadState_Get(); PyEval_ReleaseThread(m_pyThreadState); 2) Im Mainthread am Ende: // wichtig, sonst Fehler, weil Threadstate NULL PyEval_AcquireThread(m_pyThreadState); Py_Finalize(); 3) Vor einem Python-Funktionsaufruf (Klasse PythonCall im gestern geschickten Beispiel) m_GIL = PyGILState_Ensure(); 4) Nach einem Python-Funktionsaufruf PyGILState_Release(m_GIL); Und damit scheint es zu klappen; die Threads können parallel (naja, semiparallel) ablaufen. Übrigens, in einem Anfall geistiger Umnachtung (der sich schwer von meinem Normalzustand unterscheiden läßt, ich weiß), habe ich mir boost.python angeschaut - kann es sein, daß sich der Code da gar nicht um Threads kümmert? Abgesehen davon, daß mir angesichts selbigenTemplatecodes die mir heute bevorstehende Weisheitszahnentfernung geradezu als paradiesische Verheissung erscheint. _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (1)
-
Gerson Kurz