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