Python 3.12.2 上的 GIL 问题

问题描述 投票:0回答:1

我正在使用此代码:

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 python-3.x multithreading python-c-api gil
1个回答
0
投票

你的代码在任何版本的 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。

© www.soinside.com 2019 - 2024. All rights reserved.