Python 3.12.2中的GIL问题
我正在使用这段代码:
PyThreadState * thread = PyEval_SaveThread();
PyGILState_STATE gil = PyGILState_Ensure();
// ...
PyGILState_Release(gil);
PyEval_RestoreThread(thread);
在Python 3.11.8版本下运行得很好,但当我切换到3.12.2版本时,我的应用程序在第一个变量处崩溃,错误信息是:
致命的Python错误:这个函数必须在持有GIL的情况下调用,必须在Python初始化后和Python结束前,但现在GIL已经释放(当前Python线程状态为NULL)
这是什么问题,我该如何解决?我知道在3.11和3.12之间对GIL做了一些更改,但我没有找到关于我遇到的问题的任何信息。
1 个回答
1
你的代码在任何版本的Python中都没有意义:
PyEval_SaveThread
和PyEval_RestoreThread
是用来在Python创建的线程中释放和重新获取全局解释器锁(GIL)的(通常你会用Py_BEGIN_ALLOW_THREADS
和Py_END_ALLOW_THREADS
这两个宏来简化这个过程)。PyGILState_Ensure
和PyGILState_Release
是为了让那些不是通过Python的threading
模块创建的线程(因此没有GIL状态)在调用Python代码之前获取GIL。
你的错误提示表明你可能已经释放了GIL,或者你可能在一个不是通过threading
模块创建的线程中,因此PyEval_SaveThread
无法被调用(你试图保存一个不存在的线程状态,因为它不是活动的Python线程)。你需要知道你是哪种类型的线程,并且只使用与该类型线程相关的GIL管理API(绝对不要重复释放GIL或类似的操作)。
我强烈建议你阅读关于线程的API文档,以帮助理解你正在调用的API。