用线程提升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&)
时,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的主要内容,如果未能解决你的问题,请参考以下文章