一、協程 1.歷史進程: (1)3.4引入協程,用yield來實現 (2)3.5引入協程語法 (3)實現協程比較好的包有asyncio,tornado,gevent 2.定義:協程是為非搶占式多任務產生子程式的電腦程式組件,協程允許不同入口點在不同位置暫停或開始執行程式 3.從技術角度講,協程就是 ...
一、協程
1.歷史進程:
(1)3.4引入協程,用yield來實現
(2)3.5引入協程語法
(3)實現協程比較好的包有asyncio,tornado,gevent
2.定義:協程是為非搶占式多任務產生子程式的電腦程式組件,協程允許不同入口點在不同位置暫停或開始執行程式
3.從技術角度講,協程就是一個可以暫停執行的函數,或者乾脆把協程理解為一個生成器
4.協程對資源的消耗很小,要比多進程消耗的資源小多了,因此多併發下,協程更節省資源。
5.協程的實現
(1)yield返回;(2)send調用
(3)協程的三個狀態:
inspect.geigeneratorstate(...)函數確定,該函數會返回下麵的字元串中的一個:
GEN_CREATED:等待開始執行
GEN_RUNNING:解釋器正在執行
GEN_SUSPENED:在yield表達式處暫停
GEN_CLOSED:執行結束
next預激(prime)
6.舉例子(註意裡面的註釋)
def simple_coroutine(): print("->start") x = yield#這個函數執行到這裡停止了,等待著給它賦值,也就是後面的send語句 print("->recived",x) #主線程 sc = simple_coroutine() print(1111) #可以使用sc.send(None),效果一樣 next(sc)#預激 print(2222) sc.send("zhexiao")
執行順序過程如下:
執行結果:
7,既返回值又用send語句的代碼
註意:
可以看出這個yield相當於return 語句通過後面的send,之後等價於input語句
def simple_coroutine2(a): print("->start") b = yield a#可以看出這個yield相當於return 語句通過後面的send,之後等價於input語句 print("->recived",a,b) c = yield a+b print("->recived",a,b,c) sc2 = simple_coroutine2(5) aa = next(sc2) print(aa) bb = sc2.send(6) #5,6 print(bb) cc = sc2.send(7) #5,6,7 print(cc)
8.協程異常
協程中未處理的異常會向上冒泡,傳給next函數或者send方法的調用方(即觸發協程的對象)
停止協程的一種方法:發送某個哨符值,讓協程退出,內置的None和Ellipsis等常量經常用作哨符值
二、源碼
d27_3_usage_of_coroutine.py
https://github.com/ruigege66/Python_learning/blob/master/d27_3_usage_of_coroutine.py
2.CSDN:https://blog.csdn.net/weixin_44630050(心悅君兮君不知-睿)
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料