如何获取当前的PyInterpreterState?
我想创建一个 PyThreadState
,因为当前线程似乎没有一个。
我该如何获取当前的 PyInterpreterState
,以便传递给 PyThreadState_New(...)
?还是说这只有在我嵌入一个解释器(也就是我自己创建了它)时才需要做,而不是从 Python 调用一个库的时候?
3 个回答
1
如果你想从一个不是用Python创建的线程里调用Python的代码,你可以使用PyGILState_Ensure()这个接口。这个接口会帮你创建一个临时的线程状态,如果当前线程还没有的话。
想了解更多细节,可以查看这个链接:http://docs.python.org/c-api/init.html#non-python-created-threads。
从Python线程中调用的代码释放GIL(全局解释器锁)会更简单,你可以使用Py_BEGIN(/END)_ALLOW_THREADS
这些宏来实现。详细信息可以参考这个链接:http://docs.python.org/c-api/init.html#releasing-the-gil-from-extension-code。
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
结果发现,主线程没有 PyThreadState
是个致命错误。对我来说,这个问题是因为同时链接了两个不同版本的 Python,所以这个问题有点无关紧要。