Python 当其他工作线程使用C++;代码
我创建了一个简单的GUI应用程序,希望在工作线程而不是事件调度线程上运行长时间的操作,以保持GUI的响应性 只要辅助线程正在运行python函数,这就可以正常工作。但是,如果函数在C++代码上做了一些事情,GUI线程就好像在它上面执行而不是在工作者线程上执行长时间的动作一样!p> 看起来好像有一些隐藏的锁阻止GUI线程与工作线程并行运行 我怀疑它可能与正在使用的UI框架有关,所以我尝试了TKinter和wxPython中的任何一个,问题出现在这两个平台上 我正在Windows7上使用VisualStudio2010和python 2.7.5Python 当其他工作线程使用C++;代码,python,user-interface,boost-python,event-dispatch-thread,worker,Python,User Interface,Boost Python,Event Dispatch Thread,Worker,我创建了一个简单的GUI应用程序,希望在工作线程而不是事件调度线程上运行长时间的操作,以保持GUI的响应性 只要辅助线程正在运行python函数,这就可以正常工作。但是,如果函数在C++代码上做了一些事情,GUI线程就好像在它上面执行而不是在工作者线程上执行长时间的动作一样!p> 看起来好像有一些隐藏的锁阻止GUI线程与工作线程并行运行 我怀疑它可能与正在使用的UI框架有关,所以我尝试了TKinter和wxPython中的任何一个,问题出现在这两个平台上 我正在Windows7上使用Visual
这里是C++代码:
注意:我也尝试过使用睡眠进行非忙等待(timeSec*1000L),具有相同的行为#include<boost/python.hpp>
#include <ctime>
void busyWait(int timeSec) {
clock_t beginTime(clock());
while (clock() - beginTime < timeSec * 1000L);
}
using namespace boost::python;
BOOST_PYTHON_MODULE(BusyCpp) {
def("busyWait", &busyWait, "waits...");
}
单击“忙碌的C++”按钮时,可以看到GUI没有响应(等待时按钮看起来像是单击的),这些打印输出按此顺序显示,两个打印输出仅在等待结束后显示:
Done waiting C++
Started thread
因此很明显,只有在工作线程完成其工作后,GUI线程才能打印“启动线程”
你知道如何克服这个线程问题吗
谢谢“看起来好像有一些隐藏的锁”它没有隐藏得那么好,它被称为全局解释器锁(GIL),任何在Python中执行多线程的人都应该知道它
< > C++代码可以获取并释放锁本身。请参阅。在Python中调用的扩展代码中执行长时间运行的计算时,您需要这样做
您可以使用成对的宏Py\u BEGIN\u ALLOW\u THREADS
Py\u BEGIN\u ALLOW\u THREADS
,或使用范围管理器(例如):
这很有帮助。在将CopeDeGelEffice实例添加到我的C++函数之后,一切都像是魅力。@ YalonLotan:这提供了一个解决方案,可以将代码< > BuyWaWITE()/<代码>解耦,使其不必知道Python。在Python之外运行C++线程,调用Cuth> BuyWaWITE()/Cuff>可能是值得考虑的。谢谢,它确实解释了所有这些。我使用了@ectamur ScopedGillRelease,它很有效。
Started thread
Done waiting python
Done waiting C++
Started thread
class ScopedGILRelease {
public:
inline ScopedGILRelease() { m_thread_state = PyEval_SaveThread(); }
inline ~ScopedGILRelease() {
PyEval_RestoreThread(m_thread_state);
m_thread_state = NULL;
}
private:
PyThreadState* m_thread_state;
};