摘要:協程是用來處理阻塞和流程阻塞這兩個普世問題的得力工具,可以達到比較好的。這段代碼執行的輸出是通過這個例子,可以了解到的的兩個特性。被調用一次,函數就往前執行一步。通過控制,可以從外面控制函數內部的執行進度。
很多碼農終其一生可能在代碼上干的事情無非就是追求兩件事情:Logic Locality 和 Data Locality。前者決定了開發效率,后者決定了運行效率。協程是用來處理I/O阻塞和流程阻塞這兩個普世問題的得力工具,可以達到比較好的Logic Locality。
def demo_before_and_after(): print("before") yield print("after") gen = demo_before_and_after() gen.next() gen.next()
這段代碼執行的輸出是
gen created before after Traceback (most recent call last): ... StopIteration
通過這個例子,可以了解到Python的generator的兩個特性。
首先,demo_before_and_after()的時候,before并沒有被打印出來。說明demo_before_and_after這個函數在這個時候還沒有真正開始執行。gen.next()被調用一次,函數就往前執行一步。通過控制gen.next(),可以從外面控制函數內部的執行進度。
其次,Python的generator沒有類似Java的Iterator.hasNext這樣的設計,直接以拋出StopIteration來傳達“到尾巴了”這個消息。
利用generator這個特性,Python的標準庫提供了一個非常方便的contextmanager的設計
import contextlib @contextlib.contextmanager def demo_before_and_after(): print("before") yield print("after") with demo_before_and_after(): print("inside")
輸出結果是
before inside after
很多需要獲得資源,使用資源,然后確保資源被正確釋放的場合(類似C++的RAII),都可以用上面的寫法來實現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37382.html
摘要:的是可以有輸入輸出的,這個特性并不廣為人知。也就是要求不返回值,而是拋出給定的異常。執行之后的輸出與前面是一樣的。 Python的generator是可以有輸入輸出的,這個特性并不廣為人知。這其實是一個挺有用的特性,利用其外部可控制執行進度的特性,再加上可以與外部進行輸入輸出,generator可以被用來打造成一個異步執行框架,或者說是協程調度引擎。 我們先來看一個最簡單的例子,gen...
摘要:協程其實就是一個可中途中斷,由外部來控制執行進程的函數。這些第三方的選擇的共同特點是協程的都是隱式的。這就是顯示控制和隱式控制的區別。本文討論的協程就是這一種,后面會逐漸展開到如何利用這種顯示控制的協程來解決阻塞和流程阻塞的問題。 Python官方的實現里,協程只有generator這一招。協程其實就是一個可中途中斷,由外部來控制執行進程的函數。除了官方的generator,還有很多第...
摘要:比如里可以直接把執行權交給,而完全不知情。雖然不能和多線程相比,但是效果是類似的。對于多線程的代碼,是任何一行代碼都可能與其他線程并行。加上協程之間有共享狀態的話,一定程度上會產生類似多線程的并發讀寫狀態的。 前面講generator是顯式的協程的時候缺一個例子,現在補上 def parent_generator(): print(hello) yield from ...
摘要:我們可以看一下的可見是由內部支持的,其實現原理上就避免了棧進棧出的消耗,直接由最內層的返回值。另外可以實現外部直接向最內層的傳遞值,比如這段代碼的輸出是這樣傳值的方式,在用循環重新的模式下是無法實現的。這也就是必須使用,而不能使用的原因。 在python 3.3里,generator新增了一個語法 yield from 這個yield from的作用是什么?看下面兩段對比的代碼: d...
摘要:同時,迭代器有一個方法來向函數中暫停處拋出一個錯誤,該錯誤依然可以通過函數內部的模塊進行捕獲處理。 本文翻譯自:Diving Deeper With ES6 Generators 由于個人能力有限,翻譯中難免有紕漏和錯誤,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...
閱讀 2062·2023-04-25 21:11
閱讀 2963·2021-09-30 09:47
閱讀 2272·2021-09-24 09:48
閱讀 4428·2021-08-23 09:43
閱讀 895·2019-08-30 15:54
閱讀 559·2019-08-28 18:01
閱讀 1397·2019-08-27 10:55
閱讀 588·2019-08-27 10:55