1、通过判断指令计数器切换GIL
(1)python的解释器是在一个大的循环中逐个解析字节码指令;
(2)每次循环开始都会检查一下_Py_Ticker的值。
{ ... for (;;) ... if (--_Py_Ticker < 0) { ... _Py_Ticker = _Py_CheckInterval; ... if (interpreter_lock) { ... PyThread_release_lock(interpreter_lock); PyThread_acquire_lock(interpreter_lock, 1); } } ... switch (opcode) { case: ... } } }
2、IO阻塞之前切换GIL
Python允许在执行block型的system call之前允许其他线程执行(Py_BEGIN_ALLOW_THREADS),然后再重新尝试获取GIL(Py_END_ALLOW_THREADS)。
#define Py_BEGIN_ALLOW_THREADS { \ PyThreadState *_save; \ _save = PyEval_SaveThread();
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试