【问题标题】:Realtime processing and callbacks with Python and C++使用 Python 和 C++ 进行实时处理和回调
【发布时间】:2011-02-26 03:16:00
【问题描述】:

我需要编写代码来进行一些计算上相当复杂的实时处理。我想创建一些 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 中运行回调?任何人都有链接或教程来帮助我正确地做到这一点?

【问题讨论】:

    标签: c++ python callback real-time


    【解决方案1】:

    看看Boost.Python。它的教程开始于here

    【讨论】:

      【解决方案2】:

      我建议按照 ChristopheD 的建议使用 Boost.Python。如果 C++ 扩展在它自己的线程上下文中运行(不是由 Python 创建的),那么问题将是。如果是这种情况,请确保在从 C++ 调用 Python 代码时使用 PyGILState_Ensure() and 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!)

      【讨论】:

        【解决方案3】:

        我们会做您在工作中经常做的事情。我们喜欢 python,但它有时不够快。
        BoostSwig 都适合这样做。您还应该在 Python Performance 上查看此链接,他们会谈论一些关于 NumPy 的内容,这可能会对您有所帮助。

        【讨论】:

          【解决方案4】:

          Here 是一个如何使用Cython 进行python 回调的示例。 Pyrex 可能也值得一看。两者都可以使 C/C++ 与 Python 的集成变得相当容易。

          【讨论】:

            猜你喜欢
            • 2015-09-11
            • 1970-01-01
            • 1970-01-01
            • 2011-10-01
            • 1970-01-01
            • 2020-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多