Как обернуть цикл обработки сообщений обратными вызовами с помощью boost::python (не забывая о GIL)

Я хочу обернуть существующую библиотеку 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) откуда я могу скопировать некоторые лучшие практики?


person frans    schedule 17.07.2015    source источник
comment
Этот ответ демонстрирует, как безопасно обернуть обратный вызов Python в обработчик, и охватывает некоторые тонкие детали, такие как управление GIL во время копирования. строительство и разрушение.   -  person Tanner Sansbury    schedule 17.07.2015