我在python多线程脚本中使用以下代码(从web上获得):
class PyMainGuard
{
public:
PyMainGuard()
{
Py_Initialize();
PyEval_InitThreads();
mGilState = PyGILState_Ensure();
mThreadState = PyEval_SaveThread();
}
~PyMainGuard()
{
PyEval_RestoreThread( mThreadState );
PyGILState_Release( mGilState );
Py_Finalize();
}
private:
PyGILState_STATE mGilState;
PyThreadState* mThreadState;
};
class PyThrGuard
{
public:
PyThrGuard()
{
mMainGilState = PyGILState_Ensure();
mOldThreadState = PyThreadState_Get();
mNewThreadState = Py_NewInterpreter();
PyThreadState_Swap( mNewThreadState );
mSubThreadState = PyEval_SaveThread();
mSubGilState = PyGILState_Ensure();
}
~PyThrGuard()
{
PyGILState_Release( mSubGilState );
PyEval_RestoreThread( mSubThreadState );
Py_EndInterpreter( mNewThreadState );
PyThreadState_Swap( mOldThreadState );
PyGILState_Release( mMainGilState );
}
private:
PyGILState_STATE mMainGilState;
PyThreadState* mOldThreadState;
PyThreadState* mNewThreadState;
PyThreadState* mSubThreadState;
PyGILState_STATE mSubGilState;
};
在主线程中,我需要创建PyMainGuard,然后在每一个线程中我都要创建pythguard,它创建了独立的解释器,允许我毫无问题地使用线程。但他们仍然共享相同的资源。在
例如,如果我要使用这个脚本:
^{pr2}$有时我会崩溃,有时会在windows日志中创建事件,其文本行数不超过3行(也就是说,不同的线程将写入一个事件,我猜具有相同的EventHandle)。在
看起来我的线程仍然在同一个interpeter中工作,而不是在不同的interpeter中。或者有可能win32evtlog是非常线程不安全的,它只加载一个(不是像我想要的那样为每个解释器加载)并产生这样的问题。在
问题是:如何为每个线程实现不同的解释器?在
目前没有回答
相关问题 更多 >
编程相关推荐