Boost.Python: Wrap funkcje do wydania GIL
Obecnie pracuję z Boost.Python i chciałbym, aby ktoś pomógł rozwiązać problem.
Kontekst
Gdy metoda / funkcja C ++ jest wystawiona na działanie Pythona, musi zwolnić GIL (Global Interpreter Lock), aby umożliwić innym wątkom korzystanie z interpretera. W ten sposób, gdy kod Pythona wywołuje funkcję C ++, interpreter może być używany przez inne wątki. Na razie każda funkcja C ++ wygląda tak:
// module.cpp
int myfunction(std::string question)
{
ReleaseGIL unlockGIL;
return 42;
}
Aby go przekazać, aby zwiększyć python, robię:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", &myfunction);
}
Problem
Ten schemat działa dobrze, ale sugeruje tomodule.cpp
zależy odBoost.Python
bez powodu. Idealnie, tylkopython_exposure.cpp
powinien zależeć odBoost.Python
.
Rozwiązanie?
Mój pomysł polegał na graniuBoost.Function
aby zawinąć wywołania funkcji w ten sposób:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", wrap(&myfunction));
}
Tutajwrap
byłby odpowiedzialny za odblokowanie GIL podczas połączeniamyfunction
. Problem z tą metodą jest takiwrap
musi mieć taki sam podpis jakmyfunction
co oznaczałoby całkiem ponowne wdrożenieBoost.Function
...
Byłbym bardzo wdzięczny, gdyby ktoś miał jakieś sugestie dotyczące tego problemu.