在我的4核 CPU 計算機中,單線程所花的時間是 6.5 秒。
多線程
創建兩個子線程 t1、t2,每個線程各執行 5 千萬次減操作,等兩個線程都執行完後,主線程終止程序運行。結果,兩個線程以合作的方式執行是 6.8 秒,反而變慢了。按理來說,兩個線程同時並行地運行在兩個 CPU 之上,時間應該減半才對,現在不減反增。
是什因導致多線麽原程不快反慢的呢?
原因就在於 GIL ,在 Cpython 解釋器中,有壹把全局解釋鎖(Global Interpreter Lock),在解釋器解釋執行 Python 代碼時,先要得到這把鎖,意味著,任何時候只可能有壹個線程在執行代碼,其它線程要想獲得 CPU 執行代碼指令,就必須先獲得這把鎖,如果鎖被其它線程占用了,那麽該線程就只能等待,直到占有該鎖的線程釋放鎖才有執行代碼指令的可能。
因此,這也就是為什麽兩個線程壹起執行反而更加慢的原因,因為同壹時刻,只有壹個線程在運行,其它線程只能等待,即使是多核CPU,也沒辦法讓多個線程並行執行代碼,只能是交替執行,因為多線程涉及到上線文切換、鎖機制處理(獲取鎖,釋放鎖等),所以,多線程執行不快反慢。