
前面的這段話是來自我看的一片博文。【一切基於cpython】
cpu密集為何使用多進程:
1.獲取GIL 2.執行代碼直到sleep或者是python虛擬機將其掛起。 3.釋放GIL 可見,某個線程想要執行,必須先拿到GIL,我們可以把GIL看作是“通行證”,並且在一個python進程中,GIL只有一個。拿不到通行證的線程,就不允許進入CPU執行。 在python2.x里,GIL的釋放邏輯是當前線程遇見IO操作或者ticks計數達到100(ticks可以看作是python自身的一個計數器,專門做用於GIL,每次釋放后歸零,
這個計數可以通過 sys.setcheckinterval 來調整),進行釋放。 而每次釋放GIL鎖,線程進行鎖競爭、切換線程,會消耗資源。並且由於GIL鎖存在,python里一個進程永遠只能同時執行一個線程(拿到GIL的線程才能執行),
這就是為什么在多核CPU上,python的多線程效率並不高。
io密集為何使用多線程
IO密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,而開啟多線程能在線程A等待時,
自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率)。所以python的多線程對IO密集型代碼比較友好。
