1.協程可以讓程式停留在上一次被呼叫的位置.當程式停止時,去執行其他的程式。
優點:(1)程序和執行緒都面臨著核心態和使用者態的切換問題而耗費許多切換時間,而協程就是使用者自己控制切換的時機,不再需要陷入系統的核心態。
協程的執行效率非常高。因為子程式切換不是執行緒切換,而是由程式自身控制。因此,沒有執行緒切換的開銷,和多執行緒相比,執行緒數量越多,相同數量的協程體現出的優勢越明顯
(2)不需要多執行緒的鎖機制。由於只有乙個執行緒,也不存在同時寫變數的衝突,在協程中控制共享資源不需要加鎖,只需要判斷資料的狀態,所以執行效率遠高於執行緒 ,對於多核cpu可以使用多程序+協程來盡可能高效率地利用cpu。
python中yield協程的實現:
def main():
for i in range(10):
#yield作用使程式在這裡停止,並且當呼叫next方法時,把當前i的值返回。
yield i
#這裡函式返回值,會在上面迴圈依次完成時被輸出
return "hello"
a = main()
while true:
try:
#通過next方法
print(next(a))
except exception as e:
#這個e異常存的是函式返回值
print(e)
break
python 中gevent 協程實現:
from gevent import monkey
import time
#這裡讓程式遇到暫停就貼換,去做其他事情
monkey.patch_all()
def demo1():
while true:
print("..1..")
#讓程式睡1秒再開始執行
time.sleep(1)
def demo2():
while true:
print("..2..")
# 讓程式睡1秒再開始執行
time.sleep(1)
def main():
#準備協程、g1,g2
g1=gevent.spawn(demo1)
g2 = gevent.spawn(demo2)
#開啟協程1,2,協程只有被開始才會生效。
g1.join()
g2.join()
#這裡協程比較多時寫成一般寫成
# gevent.joinall([gevent.spawn(demo1),gevent.spawn(demo2)])
if __name__ == '__main__':
main()
python協程使用 協程的案例
概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...
python 併發程式設計 協程 協程介紹
協程 是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的 需要強調的是 1.python的執行緒屬於核心級別的,即由作業系統控制排程 如單執行緒遇到io或執行時間過長就會被迫交出cpu執行許可...