Python和C++的实时处理与回调
我需要写一些代码来处理实时数据,这个过程比较复杂。我想创建一些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
这样做可能吗?我该如何在一个正在运行的C++模块的循环中,从Python中调用回调函数呢?有没有人能提供一些链接或教程,帮我正确地实现这个?
4 个回答
你可以看看 Boost.Python。它的教程从 这里 开始。
我建议使用Boost.Python,正如ChristopheD所提到的。不过有个需要注意的地方,如果你的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的典型方式现在是:
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
来包裹C++函数,以释放全局解释器锁GIL!)