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...

Я был бы очень благодарен, если бы у кого-нибудь было предложение по этой проблеме.

Ответы на вопрос(2)

Ваш ответ на вопрос