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::thread
和std::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 和 Eigen/dense 创建分段错误