Python進程、線程、協程的對比
阿新 • • 發佈:2018-12-18
推薦 輕量 沖突 https 而在 明顯 ted 流行 程序
作者:chaosmind
鏈接:https://www.jianshu.com/p/0ec911909dff
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。
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核心,提高效率。
- 所以大並發下的最佳實踐就是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。
作者:chaosmind
鏈接:https://www.jianshu.com/p/0ec911909dff
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。
Python進程、線程、協程的對比