加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – PyEval_InitThreads何时被调用?

发布时间:2020-12-16 21:42:00 所属栏目:Python 来源:网络整理
导读:参见英文答案 PyEval_InitThreads in Python 3: How/when to call it? (the saga continues ad nauseam)7个 当我应该调用PyEval_InitThreads时,我有点困惑.通常,我知道只要使用非Python线程(即在扩展模块中生成的线程),就必须调用PyEval_InitThreads. 但是,
参见英文答案 > PyEval_InitThreads in Python 3: How/when to call it? (the saga continues ad nauseam)7个
当我应该调用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后如何释放GIL?

解决方法

大多数应用程序根本不需要了解PyEval_InitThreads().

你应该使用它的唯一一次是你的嵌入应用程序或扩展模块将从多个线程进行Python C API调用,它是在Python之外产生的.

不要在任何稍后将进行Python C API调用的线程中调用PyEval_ReleaseLock()(除非您在之前重新获取它).在这种情况下,您应该使用Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS宏.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读