Python和C++的实时处理与回调

6 投票
4 回答
4250 浏览
提问于 2025-04-15 23:23

我需要写一些代码来处理实时数据,这个过程比较复杂。我想创建一些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 个回答

0

这里有一个例子,展示了如何使用 Cython 在 Python 中实现回调函数。你也可以看看 Pyrex,这两个工具都能让你把 C/C++ 和 Python 结合起来变得很简单。

4

你可以看看 Boost.Python。它的教程从 这里 开始。

3

我建议使用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_THREADSPy_END_ALLOW_THREADS来包裹C++函数,以释放全局解释器锁GIL!)

撰写回答