我对什么时候应该打电话有点困惑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
呢?