c语言中python脚本的多线程使用++

2024-05-12 22:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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是非常线程不安全的,它只加载一个(不是像我想要的那样为每个解释器加载)并产生这样的问题。在

问题是:如何为每个线程实现不同的解释器?在


Tags: pyrelease线程stateensurepyevalpythreadstatepygilstate