作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
<分区>
我对什么时候应该调用 PyEval_InitThreads
有点困惑。一般来说,我知道只要使用非 Python 线程(即在扩展模块中生成的线程),就必须调用 PyEval_InitThreads
。
但是,我很困惑 PyEval_InitThreads
是用于嵌入 Python 解释器的 C 程序,还是用于导入 C 扩展模块的 Python 程序,或者两者兼而有之。
那么,如果我编写一个将在内部启动线程的 C 扩展模块,我是否需要在初始化模块时调用 PyEval_InitThreads
?
此外,PyEval_InitThreads
implicitly acquires the Global Interpreter Lock .因此,在调用 PyEval_InitThreads
之后,大概 GIL 必须被释放,否则就会发生死锁。那么如何释放锁呢?阅读文档后,PyEval_ReleaseLock()
似乎是释放GIL的方式。但是,实际上,如果我在 C 扩展模块中使用以下代码:
PyEval_InitThreads();
PyEval_ReleaseLock();
...然后在运行时 Python 中止:
Fatal Python error: drop_gil: GIL is not locked
那么用PyEval_InitThreads
获取GIL后如何释放呢?
这个问题在这里已经有了答案: PyEval_InitThreads in Python 3: How/when to call it? (the saga continues ad nauseam)
基本上,对于 PyEval_InitThreads() 的确切时间,似乎存在大量混淆/歧义。应该被调用,并且需要什么伴随的 API 调用。 official Python documentation不
我是一名优秀的程序员,十分优秀!