Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用boost::python(记住GIL)用回调包装消息循环_Python_C++_Wrapper_Boost Python_Gil - Fatal编程技术网

如何使用boost::python(记住GIL)用回调包装消息循环

如何使用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) 从

我想包装一个现有的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)

从C++调用Python函数没有问题,但是消息循环需要释放<代码>吉尔< /C> >,否则它会阻塞整个Python解释器(参见,和相关)

如上所述,在调用Python函数之前再次锁定
GIL
非常重要

原则上,这对我来说是可以理解的,但我想知道是否有任何优雅的解决方案可以说明如何做到这一点。 例如,如果我只需要修改boost::python包装器(而不是修改我想要包装的库),那就太好了

您是否知道任何工作示例,其中涉及使用面向对象方法的boost::python回调(可能还包括释放
GIL
的阻塞函数)我可以从何处复制一些最佳实践?

这演示了如何在处理程序中安全地包装Python回调,并涵盖了一些微妙的细节,例如复制构造和销毁期间的GIL管理。