Python中如何切換GIL?

johnchou發表於2021-09-11

Python中如何切換GIL?

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();

以上就是Python中切換GIL的方法,希望對大家有所幫助。更多Python學習推薦:

本文教程操作環境:windows7系統、Python 3.9.1,DELL G3電腦。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4422/viewspace-2830388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章