Python中進程、線程、協程區別
多進程
適合密集CPU任務,充分利用多核CPU資源(大量的並行計算,循環計數運算)
缺點:
多個進程之間的通信成本和切換開銷很高,如果程序涉及到大量數據通信或切換任務,不適合用多進程
multiprocessing
多線程
密集IO任務(網絡IO,磁盤IO,數據庫IO)
threading,multiprocessing.dummy
缺點:同一個時間內存一次只能運行一個線程,可以做到併發,但是不能做到並行
優點:通信方便,切換開銷小(非常適合爬蟲這種不斷切換任務的場景)
協程
微線程,不由操作系統調度(沒有CPU切換開銷),特點是在單個線程上切換多個函數任務,切換掉段任務由程序員控制,不涉及操作系統管理,也不需要處理器
gevent
gevent.monkey.patch_all():降Python底層的網絡庫(socket,select)打個補丁,在執行網絡任務時可以按異步的方式執行(涉及到網絡IO阻塞會自動切換協程)
優點:
執行任務基於程序員管理,不需要操作系統調度,沒有切換開銷,執行效率非常高。
缺點:
單線程執行,不能處理密集CPU任務,本地磁盤密集IO任務
注意:協程是在原有的網絡請求庫上打了補丁,所以適用於爬蟲。