在销毁子解释器后释放GIL 我将Python 3.2嵌入C++应用程序中,并且在程序中的不同时间运行了几个子解释程序(由代码< pyy NeXelpter < /COD>创建)。他们在不同的时间获得并释放GIL,但我在想摧毁其中一名副口译员时遇到了问题

在销毁子解释器后释放GIL 我将Python 3.2嵌入C++应用程序中,并且在程序中的不同时间运行了几个子解释程序(由代码< pyy NeXelpter < /COD>创建)。他们在不同的时间获得并释放GIL,但我在想摧毁其中一名副口译员时遇到了问题,python,python-3.x,interpreter,gil,Python,Python 3.x,Interpreter,Gil,要摧毁副口译员,你必须获得GIL。所以我这样做: PyEval_AcquireLock(threadstate); 然后我就用枪摧毁了翻译 Py_EndInterpreter(threadstate); 你会认为它会释放GIL,因为持有它的东西被摧毁了。但是,Py_endexplorer的文档说明: 给定的线程状态必须是 当前线程状态。见 下面讨论线程状态。 当调用返回时,当前 线程状态为空。(在调用此函数之前,必须保持全局解释器锁,并且在返回时仍保持全局解释器锁。) 因此,如果我在销毁子解

要摧毁副口译员,你必须获得GIL。所以我这样做:

PyEval_AcquireLock(threadstate);
然后我就用枪摧毁了翻译

Py_EndInterpreter(threadstate);
你会认为它会释放GIL,因为持有它的东西被摧毁了。但是,
Py_endexplorer
的文档说明:

给定的线程状态必须是 当前线程状态。见 下面讨论线程状态。 当调用返回时,当前 线程状态为空。(在调用此函数之前,必须保持全局解释器锁,并且在返回时仍保持全局解释器锁。)


因此,如果我在销毁子解释器时必须保持GIL,并且销毁子解释器会将其设置为NULL,并且我必须让获取GIL的线程释放它,那么在销毁子解释器后如何释放GIL?

如果调用
PyEval\u ReleaseLock()
直接在调用
Py\u end解释器()后执行。
?这就是医生告诉你要做的事。:)