2

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

如何让当前的 PyInterpreterState 传递给PyThreadState_New(...),或者只有在我嵌入解释器(并因此创建它)而不是从 python 调用库时才应该这样做?

4

3 回答 3

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
 */
于 2011-07-07T12:43:07.643 回答
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

于 2011-02-14T01:43:58.280 回答
1

事实证明,PyThreadState在主线程中没有 a 是一个致命错误。这是由两个不同的python版本同时链接造成的,所以这个问题有点没有实际意义。

于 2011-02-15T09:48:09.930 回答