Boost.Python: обернуть функции для освобождения GIL
В настоящее время я работаю с Boost.Python и хотел бы помочь решить сложную проблему.
контекст
Когда метод / функция C ++ предоставляется Python, ему необходимо освободить GIL (глобальную блокировку интерпретатора), чтобы позволить другим потокам использовать интерпретатор. Таким образом, когда код Python вызывает функцию C ++, интерпретатор может использоваться другими потоками. На данный момент каждая функция C ++ выглядит так:
// module.cpp
int myfunction(std::string question)
{
ReleaseGIL unlockGIL;
return 42;
}
Чтобы передать его для повышения Python, я делаю:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", &myfunction);
}
проблема
Эта схема работает нормально, однако это означает, чтоmodule.cpp
зависит отBoost.Python
без веской причины. В идеале толькоpython_exposure.cpp
должно зависеть отBoost.Python
.
Решение?
Моя идея заключалась в том, чтобы играть сBoost.Function
обернуть вызовы функций так:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", wrap(&myfunction));
}
Вотwrap
будет отвечать за разблокировку GIL во время звонкаmyfunction
, Проблема с этим методом заключается в том, чтоwrap
должна иметь такую же подпись, какmyfunction
что в значительной степени означало бы повторное внедрениеBoost.Function
...
Я был бы очень благодарен, если бы у кого-нибудь было предложение по этой проблеме.