用线程提升python

Posted

技术标签:

【中文标题】用线程提升python【英文标题】:boost python with threads 【发布时间】:2011-06-08 18:50:09 【问题描述】:

据我所知,似乎 boost::python 和 boost::thread 并不真正喜欢对方。

请参考http://pastebin.com/Cy123mJK

这是对我的 boost::python 和基于 boost::thread 的应用程序的问题的简化。

如果有人能告诉我为什么会出现这些问题;我不知道,因为我严格确保 python 交互一次使用一个线程完成。

在某些时候,程序无缘无故地因段错误而崩溃。另外,这次崩溃似乎是不可能的……

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

您在Producer::run()Consumer::run() 中同时在多个线程中运行python。

确切地说,是在锁定互斥体之前运行它:

boost::python::object writer = this->k->Get<boost::python::object>("write");

也许你没有意识到,当你在Keeper::Get 中调用boost::python::object::operator[](const std::string&amp;) 时,Boost 最终会调用PyObject_GetItem。在锁定之后和使用返回的函数之前,您需要将该 Get-call 移动到正确的位置:


  boost::mutex::scoped_lock l(this->k->python_keeper);
  boost::python::object writer = this->k->Get<boost::python::object>("write");
  writer(boost::python::str(os.str()));

编辑:删除Py_Finalize()。是的,你是对的,boost.python 不喜欢它。

【讨论】:

您好,感谢您的回答。我已将您的建议纳入测试程序,目前正在运行。此外,不应调用 boost::python 文档声明 Py_Finalize():ur1.ca/2zuwb 自我上次发表评论以来,测试程序一直在运行,没有中断。感谢您发现我的思维错误!

以上是关于用线程提升python的主要内容,如果未能解决你的问题,请参考以下文章

python中的GIL(全局解释锁)多线程能够提升效率

移除 GIL,可显著提升 Python 多线程性能么?

如何提升python的处理速度?

移除 GIL,可显著提升多线程性能么?

python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)

我啥时候应该在常规线程上使用 asyncio,为啥?它是不是提供性能提升?