Я хочу обернуть существующую библиотеку C++, которая включает цикл блокировки сообщений и вызов функций обработчика для Python, используя boost::python< /сильный>. Например.:
import my_boostpython_lib
def my_handler_fn():
do_something()
md = my_boostpython_lib.message_dispatcher()
# calls a C++ object method and blocks
md.run_message_loop(my_handler_fn)
Вызов функции Python из C++ не проблема, но цикл сообщений должен освободить GIL
, поскольку в противном случае он заблокировал бы весь интерпретатор Python (см. здесь, здесь и соответствующий бонусный билет)
Как указано здесь, важно снова заблокировать GIL
перед вызовом функции Python.
В принципе это звучит для меня понятно, но мне интересно, есть ли какие-нибудь элегантные решения, которые показывают, как это можно сделать. Например. было бы очень хорошо, если бы мне пришлось изменить только оболочку boost::python (вместо изменения библиотеки, которую я хочу обернуть)
Знаете ли вы какой-нибудь рабочий пример, который включает boost::python, обратные вызовы с использованием объектно-ориентированного подхода (и, возможно, блокирующие функции, которые освобождают GIL
) откуда я могу скопировать некоторые лучшие практики?