Boost.Python: Wrap funkcje do wydania GIL

Obecnie pracuję z Boost.Python i chciałbym, aby ktoś pomógł rozwiązać problem.

Kontekst

Gdy metoda / funkcja C ++ jest wystawiona na działanie Pythona, musi zwolnić GIL (Global Interpreter Lock), aby umożliwić innym wątkom korzystanie z interpretera. W ten sposób, gdy kod Pythona wywołuje funkcję C ++, interpreter może być używany przez inne wątki. Na razie każda funkcja C ++ wygląda tak:

// module.cpp
int myfunction(std::string question)
{
    ReleaseGIL unlockGIL;
    return 42;
}

Aby go przekazać, aby zwiększyć python, robię:

// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
    def("myfunction", &myfunction);
}

Problem

Ten schemat działa dobrze, ale sugeruje tomodule.cpp zależy odBoost.Python bez powodu. Idealnie, tylkopython_exposure.cpp powinien zależeć odBoost.Python.

Rozwiązanie?

Mój pomysł polegał na graniuBoost.Function aby zawinąć wywołania funkcji w ten sposób:

// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
    def("myfunction", wrap(&myfunction));
}

Tutajwrap byłby odpowiedzialny za odblokowanie GIL podczas połączeniamyfunction. Problem z tą metodą jest takiwrap musi mieć taki sam podpis jakmyfunction co oznaczałoby całkiem ponowne wdrożenieBoost.Function...

Byłbym bardzo wdzięczny, gdyby ktoś miał jakieś sugestie dotyczące tego problemu.

questionAnswers(2)

yourAnswerToTheQuestion