python 為什麼io密集要用多執行緒
【多執行緒為什麼能提高效率(I/O密集):一個執行緒可以操作很多內容--獲得IO資源---加工IO資源,如果使用多執行緒去操作一塊io資源,雖然有gil,但是在很短的時間內,io資源能分給很多執行緒,然後剩餘的io資源的加工操作,多執行緒幾乎是並行的,只不過是io資源獲取這塊是併發獲取的(因為gil)】
IO傳輸過程分為:傳送訊息,等待返回訊息。python多執行緒在處理io的時候,一個執行緒獲得GIL傳送訊息,然後等待返回訊息(阻塞),python此時釋放GIL, 其他執行緒得到GIL傳送訊息,然後同樣等待返回訊息(阻塞)......,這樣保證了IO傳輸過程時間的合理利用,提高io傳輸效率。
但是多核下,多核多執行緒比單核單執行緒更差,原因是單核下多執行緒,每次釋放GIL喚醒的那個執行緒都能獲得GIL鎖,能夠無縫執行,但多核下,CPU釋放GIL後,其他CPU上的執行緒都會進行競爭,但GIL可能被CPU0拿到,導致其他幾個CPU上被喚醒的執行緒會醒著等待到切換時間後又進入待排程狀態,這樣會造成執行緒顛簸,導致效率更低。
【所以多執行緒適合單核IO密集型】
為了高效利用多核,python引入多程序(原因是,每個程序有自己獨立的GIL,互不干擾,這樣就可以真正意義上的並行執行,所以在python中,多程序的執行效率優先於多執行緒(僅僅對多核cpu而言))
所以在這裡說結論:多核下,想做並行提升效率,比較通用的方法是使用多程序,能夠有效提高執行效率。
【另外,在邏輯功能比較多的程式中,為了防止主程式被掛起,其他的功能需被封裝為函式讓執行緒去開啟(開多個),其中一個功能阻塞,其他的也能執行下去】
參考自:靜覓 » Python爬蟲進階五之多執行緒的用法