Boost.Python: Funciones de envoltura para liberar GIL
Actualmente estoy trabajando con Boost.Python y me gustaría algo de ayuda para resolver un problema complicado.
Contexto
Cuando un método / función de C ++ está expuesto a Python, debe liberar el GIL (Global Interpreter Lock) para permitir que otros subprocesos utilicen el intérprete. De esta manera, cuando el código de python llama a una función de C ++, el intérprete puede ser utilizado por otros subprocesos. Por ahora, cada función de C ++ se ve así:
// module.cpp
int myfunction(std::string question)
{
ReleaseGIL unlockGIL;
return 42;
}
Para pasarlo a impulsar python, yo hago:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", &myfunction);
}
Problema
Este esquema funciona bien, sin embargo implica quemodule.cpp
depende deBoost.Python
por ninguna buena razón Idealmente, solopython_exposure.cpp
debería depender deBoost.Python
.
¿Solución?
Mi idea era jugar conBoost.Function
para envolver las llamadas de función como esta:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", wrap(&myfunction));
}
aquíwrap
estaría a cargo de desbloquear el GIL durante la llamada amyfunction
. El problema con este método es quewrap
necesita tener la misma firma quemyfunction
lo que significaría más o menos la reimplementaciónBoost.Function
...
Estaría muy agradecido si alguien tuviera alguna sugerencia para este problema.