yield自己就是一種在單線程下能夠保存任務運行狀態的方法python
# 單純地切換反而會下降運行效率 # 串行執行 import time def consumer(res): '''任務1:接收數據,處理數據''' pass def producer(): '''任務2:生產數據''' res=[] for i in range(10000000): res.append(i) return res start=time.time() # 串行執行 res=producer() consumer(res) #寫成consumer(producer())會下降執行效率 stop=time.time() print(stop-start) #1.5536692142486572 # 基於yield併發執行 import time def consumer(): '''任務1:接收數據,處理數據''' while True: x=yield def producer(): '''任務2:生產數據''' g=consumer() next(g) for i in range(10000000): g.send(i) start=time.time() # 基於yield保存狀態,實現兩個任務直接來回切換,即併發的效果 # PS:若是每一個任務中都加上打印,那麼明顯地看到兩個任務的打印是你一次我一次,即併發執行的. producer() stop=time.time() print(stop-start) #2.0272178649902344
# yield沒法作到遇到io阻塞 import time def consumer(): '''任務1:接收數據,處理數據''' while True: x=yield def producer(): '''任務2:生產數據''' g=consumer() next(g) for i in range(10000000): g.send(i) time.sleep(2) start=time.time() producer() #併發執行,可是任務producer遇到io就會阻塞住,並不會切到該線程內的其餘任務去執行 stop=time.time() print(stop-start)
併發執行,可是任務producer遇到io就會阻塞住,並不會切到該線程內的其餘任務去執行
併發
協程是一種用戶態的輕量級線程,即協程是由用戶程序本身控制調度的。app
它本質就是在單線程下,由用戶本身控制一個任務遇到io阻塞了就切換另一個任務去執行,以此來提高效率。函數
總結協程特色:操作系統