============================== 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。