協程,又叫微線程或者纖程。它是比線程更為細小的線程,微線程的名字由此得來。只支持python 3.4以上的版本,不過建議使用python 3.6版本.
優點:
-
使用高並發、高擴展、低性能的;一個CPU支持上萬的協程都不是問題。所以很適合用於高並發處理
-
無需上下文的切換開銷
缺點:
-
無法利用計算機多核優勢
一般情況下,實現協程並發有三種方式
-
yield(簡單協程)
-
asyncio(Python自帶)
-
greenlet(第三方庫)
-
gevent(第三方庫)
學過Python基礎的朋友們都知道,函數的返回值有兩種方式,一種是最常用的return
,還有一種是yeild
,雖然它是起到掛起的作用,但是依舊能返回值。
基本思路就是創建生成器然后獲取生成器並執行:
這就是最為簡單的協程的實現,異步IO的實現
import time def func1(): while True: print('正在執行:func1') yield time.sleep(2) def func2(): while True: print('正在執行:func2') yield time.sleep(2) if __name__ == '__main__': for i in range(5): next(func1()) next(func2())
在不開啟線程的基礎上,實現多個任務,協程是一個特殊的生成器
實現過程:
-
func1 生成器
-
func2 生成器
-
獲取生成器
-
運行生成器
帶yield的函數是一個生成器,而不是一個函數了,生成器有一個next函數,next相當於'下一步',這一次的next開始的地方就是接着上一次next停止的地方執行,所以調用next的時候,並不會從fun函數執行,只是接着上一次停止的地方開始。