我想创建一个PyThreadState
,因为当前线程似乎没有。{/ p>
如何将当前的PyInterpreterState传递给PyThreadState_New(...)
,或者我只应该在嵌入解释器(因此创建了解释器)时才这样做,而不是从蟒?
答案 0 :(得分:4)
我猜你可能在做多线程编程。最近,我遇到了类似的问题。希望以下代码可以帮助您。
//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
*/
答案 1 :(得分:1)
如果您尝试从非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
答案 2 :(得分:1)
事实证明,主线程中没有PyThreadState
是一个致命的错误。它是由两个不同的python版本同时链接引起的,所以这个问题有些没有实际意义。