[Python-de] Mehr zu Threads

Gerson Kurz gerson.kurz at pergamon-software.de
Fre Okt 31 07:42:15 CET 2003


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.