Ich versuche, einen Teil von C ++ Code in python lib mit boost.python zu wickeln, aber ich habe herausgefunden, dass mehrere Instanzen nicht gleichzeitig ausgeführt werden können:
-Code (C ++):
%Vor%welches mit CMake (CMake) kompiliert wird:
%Vor%und getestet mit dem folgenden Code (Python):
%Vor%Die Ausgabe zeigt an, dass der Code sehr seltsam parallelisiert ist. Jeder Thread sollte nur 2 Sekunden dauern und 4 Threads sollten gleichzeitig auf meinem Quadcore-Rechner laufen:
%Vor%Danke für Ihre Hilfe!
Was Sie gerade tun, ist der Python Global Interpreter Lock. Die GIL erlaubt nur jeweils einen Thread im Python-Interpreter zu laufen.
Einer der Vorteile von Boost.Python ist, dass Sie die GIL veröffentlichen, C ++ - Sachen erledigen und sie dann zurücknehmen können, wenn Sie fertig sind. Dies ist jedoch auch eine Verantwortung. Python gibt normalerweise die GIL in regelmäßigen Abständen frei, um anderen Threads die Möglichkeit zum Ausführen zu geben. Wenn Sie in C ++ sind, ist dies Ihre Aufgabe. Wenn Sie 2 Stunden lang mit der GIL arbeiten, werden Sie den gesamten Interpreter einfrieren.
Dies kann leicht mit etwas umgekehrter RAII behoben werden:
%Vor%Jetzt können Sie Ihren Code wie folgt ändern:
%Vor%Es ist SEHR wichtig zu beachten, dass Sie KEINEN Python-Code oder Python-Daten berühren dürfen oder sich an den Interpreter wenden, wenn Sie die GIL nicht halten. Dies führt zum Absturz Ihres Interpreters.
Es ist auch möglich, in die andere Richtung zu gehen. Ein Thread, der die GIL derzeit nicht hält, kann sie erwerben und Aufrufe an Python vornehmen. Dies kann ein Thread sein, der die GIL früher freigegeben hat, oder einer, der in C ++ gestartet wurde und nie die GIL hatte. Hier ist die RAII-Klasse dafür:
%Vor%Die Nutzung bleibt als Übung für den Schüler.
Zusätzliche Anmerkung (Ich vergesse immer, dies zu erwähnen):
Wenn Sie mit der GIL in C ++ herumspielen wollen, muss Ihre Moduldefinition mit diesem Code beginnen:
%Vor%Tags und Links c++ boost parallel-processing boost-python