如何使用boost::python(记住GIL)用回调包装消息循环
我想包装一个现有的C++库,它包含了<强>阻塞消息循环>和<强>调用处理函数<强> Python 使用<强> Boo::Python 。例如:如何使用boost::python(记住GIL)用回调包装消息循环,python,c++,wrapper,boost-python,gil,Python,C++,Wrapper,Boost Python,Gil,我想包装一个现有的C++库,它包含了阻塞消息循环>和调用处理函数 Python 使用 Boo::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) 从
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)
从C++调用Python函数没有问题,但是消息循环需要释放<代码>吉尔< /C> >,否则它会阻塞整个Python解释器(参见,和相关)
如上所述,在调用Python函数之前再次锁定GIL
非常重要
原则上,这对我来说是可以理解的,但我想知道是否有任何优雅的解决方案可以说明如何做到这一点。
例如,如果我只需要修改boost::python包装器(而不是修改我想要包装的库),那就太好了
您是否知道任何工作示例,其中涉及使用面向对象方法的boost::python,回调(可能还包括释放GIL
的阻塞函数)我可以从何处复制一些最佳实践?这演示了如何在处理程序中安全地包装Python回调,并涵盖了一些微妙的细节,例如复制构造和销毁期间的GIL管理。