我想创建一个PyThreadState
,因为当前线程似乎没有一个。
如何让当前的 PyInterpreterState 传递给PyThreadState_New(...)
,或者只有在我嵌入解释器(并因此创建它)而不是从 python 调用库时才应该这样做?
我想创建一个PyThreadState
,因为当前线程似乎没有一个。
如何让当前的 PyInterpreterState 传递给PyThreadState_New(...)
,或者只有在我嵌入解释器(并因此创建它)而不是从 python 调用库时才应该这样做?
我猜你可能正在做多线程编程。最近,我遇到了类似的问题。希望以下代码对您有所帮助。
//in main thread
PyThreadState * mainThreadState = NULL;
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyThreadState_Get();
PyEval_ReleaseLock();
//in threaded thread
PyEval_AcquireLock();
PyInterpreterState * mainInterpreterState = mainThreadState->interp;
PyThreadState * myThreadState = PyThreadState_New(mainInterpreterState);
PyEval_ReleaseLock();
/*
* embeded python part
* PyEval_CallObject() for example
*/
如果您尝试从非 Python 创建的线程回调 Python,则可以使用 PyGILState_Ensure() API。如果当前线程还没有一个临时线程状态,这将负责创建一个临时线程状态。
有关更多详细信息,请参阅http://docs.python.org/c-api/init.html#non-python-created-threads。
Py_BEGIN(/END)_ALLOW_THREADS
使用宏
在从 Python 线程调用的代码中释放 GIL 更加容易:http: //docs.python.org/c-api/init.html#releasing-the-gil-from-extension-code
事实证明,PyThreadState
在主线程中没有 a 是一个致命错误。这是由两个不同的python版本同时链接造成的,所以这个问题有点没有实际意义。