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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta