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.