問題:為什么python的多線程不能利用多核CPU,但是咱們在寫代碼的時候,多線程的確是在並發,而且還比單線程快
原因:因為GIL,python只有一個GIL,運行python時,就要拿到這個鎖才能執行,在遇到I/O 操作時會釋放這把鎖。
如果是純計算的程序,沒有 I/O 操作,解釋器會每隔100次操作就釋放這把鎖,讓別的線程有機會 執行(這個次數可以通sys.setcheckinterval
來調整)同一時間只會有一個獲得GIL線程在跑,其他線程都處於等待狀態
1、如果是CPU密集型代碼(循環、計算等),由於計算工作量多和大,計算很快就會達到100,然后觸發GIL的釋放與在競爭,多個線程來回切換損耗資源,
所以在多線程遇到CPU密集型代碼時,單線程會比較快
2、如果是I\O密集型代碼(文件處理、網絡爬蟲),開啟多線程實際上是並發(不是並行),IO操作會進行IO等待,線程A等待時,自動切換到線程B,
這樣就提升了效率