Dou*_*ghy 6 c++ python real-time callback
我需要编写代码来进行一些计算复杂的实时处理.我想创建一些Python类来管理我的所有脚本,并将算法的密集部分保留在C++中,以便它们能够尽可能快地运行.我想在Python中实例化对象,并让C++算法在python中回调到回调中.就像是:
myObject = MyObject()
myObject.setCallback(myCallback)
myObject.run()
def myCallback(val):
"""Do something with the value passed back to the python script."""
pass
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如何在C++模块中运行的循环中运行python中的回调?任何人都有一个链接或教程,以帮助我正确地做到这一点?
我建议按照 ChristopheD 的建议使用 Boost.Python。如果 C++ 扩展在它自己的线程上下文中运行(不是由 Python 创建的),则会出现问题。如果是这种情况,请确保在从 C++ 调用 Python 代码时使用PyGILState_Ensure()和函数。PyGILState_Release()
从文档(http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock):
从版本 2.3 开始,线程现在可以利用 PyGILState_*() 函数自动执行上述所有操作。从 C 线程调用 Python 的典型习惯用法是:
Run Code Online (Sandbox Code Playgroud)PyGILState_STATE gstate; gstate = PyGILState_Ensure(); /* Perform Python actions here. */ result = CallSomeFunction(); /* evaluate result */ /* Release the thread. No Python API allowed beyond this point. */ PyGILState_Release(gstate)
我建议使回调简短而甜蜜 - 以限制在 C++ 代码中执行异常处理的需要。如果您使用 wxPython,您可以使用它强大的异步事件系统。或者回调可以将事件放在队列上,并且您可以有一个线程专门用于异步执行回调/事件代码。
即使拥有 Boost.Python 的魔力,在处理线程时您也必须熟悉 Python C API 的这一部分。(不要忘记用Py_BEGIN_ALLOW_THREADS并Py_END_ALLOW_THREADS释放 GIL 来包装 C++ 函数!)