Boost.Python: Wrap-Funktionen zum Freigeben der GIL
Ich arbeite derzeit mit Boost.Python und möchte Hilfe bei der Lösung eines kniffligen Problems.
Kontext
Wenn eine C ++ - Methode / -Funktion für Python verfügbar gemacht wird, muss die GIL (Global Interpreter Lock) freigegeben werden, damit andere Threads den Interpreter verwenden können. Auf diese Weise kann der Interpreter von anderen Threads verwendet werden, wenn der Python-Code eine C ++ - Funktion aufruft. Im Moment sieht jede C ++ - Funktion folgendermaßen aus:
// module.cpp
int myfunction(std::string question)
{
ReleaseGIL unlockGIL;
return 42;
}
Um Python zu verbessern, mache ich Folgendes:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", &myfunction);
}
Problem
Dieses Schema funktioniert gut, aber es impliziert, dassmodule.cpp
kommt drauf anBoost.Python
aus keinem guten Grund. Im Idealfall nurpython_exposure.cpp
sollte davon abhängenBoost.Python
.
Lösung?
Meine Idee war, damit zu spielenBoost.Function
Um die Funktionsaufrufe wie folgt zu verpacken:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", wrap(&myfunction));
}
Hierwrap
wäre dafür zuständig, die GIL während des Anrufs zu entsperrenmyfunction
. Das Problem bei dieser Methode ist daswrap
muss die gleiche Unterschrift haben wiemyfunction
das würde so ziemlich bedeuten, neu zu implementierenBoost.Function
...
Ich wäre sehr dankbar, wenn jemand Vorschläge zu diesem Problem hätte.