Embedded Boost::Python 和 C++:并行运行

Posted

技术标签:

【中文标题】Embedded Boost::Python 和 C++:并行运行【英文标题】:Embedded Boost::Python and C++ : run in parallel 【发布时间】:2013-08-13 15:25:28 【问题描述】:

如何在没有问题的情况下并行运行 C++ 和 Boost::Python 代码?

例如,在我的游戏中,我希望 Python 代码与 C++ 代码并行执行;如果嵌入式 Python 解释器的代码执行阻塞循环,例如 while(True): pass,则 C++ 代码仍将运行并处理帧以使用自己的循环进行渲染。

我尝试使用boost::threadstd::thread,但除非我将这些线程与主线程连接起来,否则程序会崩溃...

有什么建议或例子吗?

【问题讨论】:

你必须在 std::thread 被破坏之前加入它。 我愿意,但是如何防止 c++ 代码终止?使用while(!terminated) 循环? 这可能行得通,但你可能需要一种方法让它在某个时候停止 【参考方案1】:

您为 Python 解释器使用第二个线程的想法应该可行。确保在您希望运行将调用任何 Python 或 Boost::Python 代码的代码的任何地方都使用PyGILState_Ensure/Release 机制。你有更多关于this other SO thread here的详细信息。

【讨论】:

现在可以了,只添加一行!所以我不需要在最后释放锁? 很高兴它为您解决了问题。建议您释放它并在每次需要时重新获取它。 作为补充,我们使用智能锁之类的东西来做到这一点。请参阅此处的示例:github.com/idiap/bob/blob/master/src/python/gil.cc 支持评论和答案会很棒! ;-)【参考方案2】:

您需要在 python 中使用多处理模块,以便为每个 python 线程获得单独的 GIL。

【讨论】:

我希望尽可能避免使用 Python 模块,因为需要重新分发它们 :)

以上是关于Embedded Boost::Python 和 C++:并行运行的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Python 列出所有暴露的类和属性

boost::python 和回调驱动的执行

Boost::python 和 Eigen/dense 创建分段错误

Boost.python 和 OMP

提取和转换 boost::python::list 的列表元素

C++ 包括 python.h 和 boost/python.hpp 导致 SEH 异常