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.

questionAnswers(2)

yourAnswerToTheQuestion