1. 程式人生 > >Python進程、線程、協程的對比

Python進程、線程、協程的對比

推薦 輕量 沖突 https 而在 明顯 ted 流行 程序

1. 執行過程

  • 每個線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在進程中,由進程提供多個線程執行控制。每個線程都有他自己的一組CPU寄存器,稱為線程的上下文,該上下文反映了線程上次運行該線程的CPU寄存器的狀態。
  • 協程,又稱微線程,Coroutine。執行過程中,在子程序內部可中斷,然後轉而執行別的子程序,在適當的時候再返回來接著執行。實際上就是對函數調用流程的一種控制方式,讓函數互相協作配合,這就是協程。

2. 調度方式

  • 進程和線程完全由操作系統負責調度,程序自己不能決定什麽時候執行,執行多長時間。
  • 協程則是在程序中,自己負責調度,更加靈活,但復雜度較高。

3. 運行效率

  • 進程是重量級別的程序,創建和銷毀開銷大。
  • 線程是輕量級別的程序,相比進程下創建和銷毀開銷小,切換速度較快。
  • 協程則是單線程的異步編程模型。和多線程比,線程數量越多,CPU就會花掉更多時間在切換中,而沒有線程切換、保存上下文的開銷的協程,相比下運行效率則更高。第二大優勢就是不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,所以協程性能優勢更加明顯。

4. CPU利用

  • 線程和協程由於CPython中全局解釋器鎖GIL的問題,只能使用到單核CPU的計算資源
  • 進程則可以運行多個(數量與CPU核心數相同),充分利用多核CPU

CPython解釋器本身不是線程安全的,因此需要全局解釋器鎖GIL,一次只允許一個線程執行Python字節碼。因此一個Python進程不能同時使用到多個CPU核心。
然而,標準庫中所有執行阻塞型 IO 操作的函數,在等待結果返回時都會釋放GIL。這意味著盡管有GIL,Python線程還是能在 IO 密集型任務中一展身手。 引用自《流暢的Python》

5. 最佳實踐

  • 線程和協程推薦在IO密集型的任務(比如網絡調用)中使用,而在CPU密集型的任務中,表現較差。
  • 對於CPU密集型的任務,則需要多個進程,繞開GIL的限制,利用所有可用的CPU核心,提高效率。
  • 所以大並發下的最佳實踐就是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。
    順便一提,非常流行的一個爬蟲框架Scrapy就是用到異步框架Twisted來進行任務的調度,這也是Scrapy框架高性能的原因之一。


作者:chaosmind
鏈接:https://www.jianshu.com/p/0ec911909dff
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

Python進程、線程、協程的對比