我对什么时候应该打电话有点困惑PyEval_InitThreads。一般来说,我知道PyEval_InitThreads每当使用非 Python 线程(即在扩展模块中产生的线程)时都必须调用它。
但是,我很困惑PyEval_InitThreads是嵌入 Python 解释器的 C 程序,还是导入 C 扩展模块的 Python 程序,或者两者兼而有之。
那么,如果我编写一个将在内部启动线程的 C 扩展模块,我是否需要PyEval_InitThreads在初始化模块时调用?
此外,PyEval_InitThreads 隐式获取 Global Interpreter Lock。所以在调用之后PyEval_InitThreads,大概 GIL 必须被释放,否则就会出现死锁。那么如何释放锁呢?阅读文档后,PyEval_ReleaseLock()似乎是释放 GIL 的方式。但是,在实践中,如果我在 C 扩展模块中使用以下代码:
PyEval_InitThreads();
PyEval_ReleaseLock();
...然后在运行时 Python 中止:
Fatal Python error: drop_gil: GIL is not locked
那么你如何在获得 GIL 后释放它PyEval_InitThreads呢?