GIL為了達到(偽)同步的效果,都會先鎖住自己的thread,阻止別的thread執行,然後每隔一段時間,Python Interpretor 就會強制目前正在執行的thread去釋放鎖GIL,這樣別的thread才能有執行的機會。不斷交錯執行,來模擬真正thread的同步。
以文中範例:
如果執行的話,就會發現,儘管大部分時候它能夠列印100,但有時侯也會列印99或者98。
這是因為Python Interpretor檢查時間的機制,是以bytecode
為單位,而bytecode
這種單位是基於機器語言(類似可想成組合語言,一列指令為一個bytecode
),下面範例是python語言n+=1
在機器語言上的四行bycode
指令
所以當執行緒在執行時,在這四行bytecode
當中可能會因為Python Interpretor檢查的機制,覺得應該被切換了,而造成原應該要被執行的步驟被中斷,導致非預期的結果。
GIL的設計,主要是為了方便CPython解釋器層面的編寫者,而不是Python應用層面。
也因此才有其他lock的機制產生。
https://kknews.cc/code/2ngmeay.html
IPC