我正在使用此代码:
PyThreadState * thread = PyEval_SaveThread();
PyGILState_STATE gil = PyGILState_Ensure();
// ...
PyGILState_Release(gil);
PyEval_RestoreThread(thread);
在Python 3.11.8中它运行良好,但是当我将版本切换到3.12.2时,我的应用程序在第一个变量上崩溃,错误消息是:
致命的Python错误:在Python初始化之后和Python终结之前,必须在持有GIL的情况下调用该函数,但是GIL被释放(当前Python线程状态为NULL)
问题是什么以及如何解决?我知道 GIL 在 3.11 和 3.12 之间引入了一些更改,但我没有找到有关我所遇到的问题的任何信息。
你的代码在任何版本的 Python 中都毫无意义:
PyEval_SaveThread
/PyEval_RestoreThread
用于在 Python 启动的(由 threading
模块创建)线程中释放和重新获取 GIL(尽管您通常使用 Py_BEGIN_ALLOW_THREADS
和 Py_END_ALLOW_THREADS
宏来简化此操作) .
PyGILState_Ensure
/PyGILState_Release
允许由 Python 的 threading
模块(因此缺少 GIL 状态)启动的线程 not在调用 Python 级别代码之前获取 GIL。
您的错误清楚地表明您处于非
threading
创建的线程中,因此无法调用PyEval_SaveThread
(您试图保存不存在的线程状态,因为它不是Python线)。您需要知道自己属于哪种类型的线程,并仅使用与该类型线程关联的 GIL 管理 API。