如何获取当前的PyInterpreterState?

2 投票
3 回答
1923 浏览
提问于 2025-04-16 11:46

我想创建一个 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,所以这个问题有点无关紧要。

撰写回答