Boost.Python: funções Wrap para liberar o GIL
Atualmente estou trabalhando com o Boost.Python e gostaria de ajuda para resolver um problema complicado.
Contexto
Quando um método / função C ++ é exposto ao Python, ele precisa liberar o GIL (Global Interpreter Lock) para permitir que outros threads usem o interpretador. Dessa forma, quando o código python chama uma função C ++, o interpretador pode ser usado por outros threads. Por enquanto, cada função C ++ se parece com isso:
// module.cpp
int myfunction(std::string question)
{
ReleaseGIL unlockGIL;
return 42;
}
Para passá-lo para impulsionar python, eu faço:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", &myfunction);
}
Problema
Este esquema funciona bem, no entanto, implica quemodule.cpp
depende deBoost.Python
por nenhuma boa razão. Idealmente, apenaspython_exposure.cpp
deve dependerBoost.Python
.
Solução?
Minha ideia era brincar comBoost.Function
para envolver as chamadas de função assim:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", wrap(&myfunction));
}
Aquiwrap
seria responsável por desbloquear o GIL durante a chamada paramyfunction
. O problema com este método é quewrap
precisa ter a mesma assinatura quemyfunction
o que significaria praticamente re-implementaçãoBoost.Function
...
Eu ficaria muito grato se alguém tivesse alguma sugestão para este problema.