15.7 从C扩展中释放全局�¶

问题¶

你想让C扩展代�和Python解释器中的其他进程一起正确的执行, 那么你就需�去释放并�新获�全局解释器�(GIL)。

解决方案¶

在C扩展代�中,GIL�以通过在代�中�入下�这样的��释放和�新获�:

#include "Python.h"
...

PyObject *pyfunc(PyObject *self, PyObject *args) {
   ...
   Py_BEGIN_ALLOW_THREADS
   // Threaded C code.  Must not use Python API functions
   ...
   Py_END_ALLOW_THREADS
   ...
   return result;
}

讨论¶

�有当你确�没有Python C API函数在C中执行的时候你�能安全的释放GIL。 GIL需�被释放的常�的场景是在计算密集型代�中需�在C数组上执行计算(比如在numpy中) 或者是�执行阻塞的I/O�作时(比如在一个文件�述符上读�或写入时)。

当GIL被释放�,其他Python线程�被�许在解释器中执行。 Py_END_ALLOW_THREADS �会阻塞执行直到调用线程�新获�了GIL。