如何获取当前的PyInterpreterState?

时间:2011-02-13 23:16:51

标签: python c multithreading python-c-api

我想创建一个PyThreadState,因为当前线程似乎没有。{/ p>

如何将当前的PyInterpreterState传递给PyThreadState_New(...),或者我只应该在嵌入解释器(因此创建了解释器)时才这样做,而不是从蟒?

3 个答案:

答案 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版本同时链接引起的,所以这个问题有些没有实际意义。