2017-05-08 4 views
0

Ich bin Python in einer Multithread-C++ - Anwendung einbetten, ist es sicher, Py_Initialize() in mehreren Threads aufzurufen? Oder soll ich es im Hauptthread nennen?Aufruf von Py_Initialize() in mehreren Threads

+0

Mögliches Duplikat von [Ist es threadsicher, eine statische Variable zu ändern?] (Http://stackoverflow.com/questions/43837721/is-it-thread-safe-to-modify-a-static-variable) –

+0

Sie haben diese Frage bereits gestellt. wenn auch mit einem anderen Fokus. Bitte beachten Sie meine Antwort auf das Duplikat. –

Antwort

0

Der Py_Initialize() Code enthält:

if (initialized) 
    return; 
initialized = 1; 

Die Dokumentation für die Funktion auch sagt:

Dies ist eine no-op, wenn für eine Sekunde aufgerufen Zeit (ohne zuerst Py_Finalize() aufzurufen).

Meine Empfehlung ist, dass Sie es nur aus dem Hauptthread tun, obwohl es je nachdem, was Sie tun, kann es kompliziert werden.

Das Problem ist, dass Signalhandler nur im Kontext des Haupt-Python-Thread ausgelöst werden. Das heißt, welcher Thread auch immer zu rufen war: Py_Initialize(). Wenn das also ein transienter Thread ist und nur einmal verwendet und dann verworfen wird, dann hat keine Chance, jemals Signalhandler aufgerufen zu haben. Sie müssen sich Gedanken darüber machen, wie Sie mit Signalen umgehen.

Seien Sie auch vorsichtig bei der Verwendung vieler transienter Threads, die in C-Code mit nativer Thread-API erstellt wurden und in Python-Interpreter aufrufen, da jeder im Python-Interpreter Daten erzeugt. Dies wird sich anhäufen, wenn Sie diese externen Threads weiterhin erstellen und verwerfen. Sie sollten stattdessen versuchen, einen Thread-Pool zu verwenden, wenn Sie von externen Threads aus aufrufen und vorherige Threads erneut verwenden.

+0

Wenn 'Py_Initialize()' in mehreren Threads aufgerufen wird, wie garantiert man Thread-Sicherheit, wenn ein Thread diese Variable 'initialisiert' liest, während ein anderer Thread sie auf '1' schreibt? – Allanqunzi

+0

Ja, das wäre vielleicht ein anderes Thema. Sie müssten eine Mutex-Sperre um den Aufruf von '' Py_Initialize() '' in diesem Fall verwenden. –

Verwandte Themen