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宏.

相关文章

我最近重新拾起了计算机视觉,借助Python的opencv还有face_r...
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Poolin...
记得大一学Python的时候,有一个题目是判断一个数是否是复数...
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic ...
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic v...
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic ...