前言介紹
協程,又稱為微執行緒,它是實現多工的另一種方式,只不過是比執行緒更小的執行單元。因為它自帶cpu的上下文,這樣只要在合適的時機,我們可以把乙個協程切換到另乙個協程。
通俗的理解: 在乙個執行緒中的某個函式中,我們可以在任何地方儲存當前函式的一些臨時變數等資訊,然後切換到另外乙個函式中執行,注意不是通過呼叫函式的方式做到的 ,並且切換的次數以及什麼時候再切換到原來的函式都由開發者自己確定。
協程與執行緒的差異:
在實現多工時, 執行緒切換從系統層面遠不止儲存和恢復cpu上下文這麼簡單。作業系統為了程式執行的高效性,每個執行緒都有自己快取cache等等資料,作業系統還會幫你做這些資料的恢復操作,所以執行緒的切換非常耗效能。但是協程的切換只是單純地操作cpu的上下文,所以一秒鐘切換個上百萬次系統都抗的住。
下面舉例說明協程和執行緒使用過程中cpu消耗情況
1、建立執行緒測試檔案 threads.py,**內容如下:
import time
from threading import thread
defhello
(x):
"""測試任務"""
for i in
range(50
):print
(f'測試執行緒'
) time.sleep(1)
# 模擬
defthread_test()
:"""建立1000個執行緒並進行任務"""
for i in
range
(1000):
thread(target=hello, args=
(i,)
).start(
)if __name__ ==
'__main__'
: thread_test(
)
2、建立協程測試檔案 gevents.py,**內容如下:
'''
'''import gevent
from gevent import monkey
monkey.patch_all(
)import time
defhello
(x):
"""測試任務"""
for i in
range(50
):print
(f'測試協程'
) time.sleep(1)
defgevent_test()
:"""建立1000個協程任務"""
gevent.joinall(
[gevent.spawn(hello, i)
for i in
range
(1000)]
)if __name__ ==
'__main__'
: gevent_test(
)
執行結果:
結論:
開啟1000個執行緒任務所消耗的cpu是13.5%,開啟1000個協程任務消耗的cpu是 1.1%,協程遠優於執行緒
眾所周知 ,多執行緒除了會給cpu帶來切換上下文的開銷,還會產生資源競爭,想要用多執行緒,免不了加鎖操作,協程完美的避免了這個問題。
所以在多執行緒和協程都能適用的場景下,協程是乙個更好的選擇。
Python的執行緒 程序和協程
程序 乙個程序就是乙個正在執行的程式,它是計cpu分配資源的最小單位。每個程序都有自己獨立的記憶體空間。能同時執行的程序數最多不超過核心數,也就是每個核心 同一時刻只能執行乙個程序。那麼多程序就是能 同時 執行多個程序 比如同時聽 和寫 這裡的 同時 可以指cpu通過極快地在程序間來回切換來實現,所...
Python之執行緒 程序和協程
一 執行緒概念 執行緒 英語 thread 是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。二 python中線程的使用 usr bin env python c...
程序,執行緒和協程
程序 process 和執行緒 thread 是程式設計師必需掌握的核心知識。而多程序和多執行緒程式設計對於 的並行併發執行,提公升 效率和縮短執行時間至關重要。簡單總結 程序是資源分配的單位 執行緒是作業系統排程的單位 程序切換需要的資源很最大,效率很低 執行緒切換需要的資源一般,效率一般 當然了...