成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【generator101】- generator是可以被外部控制執(zhí)行進(jìn)度的函數(shù)

yacheng / 1415人閱讀

摘要:協(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

相關(guān)文章

  • generator101】 - generator輸入與輸出

    摘要:的是可以有輸入輸出的,這個特性并不廣為人知。也就是要求不返回值,而是拋出給定的異常。執(zhí)行之后的輸出與前面是一樣的。 Python的generator是可以有輸入輸出的,這個特性并不廣為人知。這其實是一個挺有用的特性,利用其外部可控制執(zhí)行進(jìn)度的特性,再加上可以與外部進(jìn)行輸入輸出,generator可以被用來打造成一個異步執(zhí)行框架,或者說是協(xié)程調(diào)度引擎。 我們先來看一個最簡單的例子,gen...

    melody_lql 評論0 收藏0
  • generator101】 - generator一種顯式控制協(xié)程

    摘要:協(xié)程其實就是一個可中途中斷,由外部來控制執(zhí)行進(jìn)程的函數(shù)。這些第三方的選擇的共同特點是協(xié)程的都是隱式的。這就是顯示控制和隱式控制的區(qū)別。本文討論的協(xié)程就是這一種,后面會逐漸展開到如何利用這種顯示控制的協(xié)程來解決阻塞和流程阻塞的問題。 Python官方的實現(xiàn)里,協(xié)程只有g(shù)enerator這一招。協(xié)程其實就是一個可中途中斷,由外部來控制執(zhí)行進(jìn)程的函數(shù)。除了官方的generator,還有很多第...

    894974231 評論0 收藏0
  • generator101】 - 對比generator和greenlet

    摘要:比如里可以直接把執(zhí)行權(quán)交給,而完全不知情。雖然不能和多線程相比,但是效果是類似的。對于多線程的代碼,是任何一行代碼都可能與其他線程并行。加上協(xié)程之間有共享狀態(tài)的話,一定程度上會產(chǎn)生類似多線程的并發(fā)讀寫狀態(tài)的。 前面講generator是顯式的協(xié)程的時候缺一個例子,現(xiàn)在補上 def parent_generator(): print(hello) yield from ...

    CoyPan 評論0 收藏0
  • generator101】 - 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...

    xiaodao 評論0 收藏0
  • 深入理解 Generator 函數(shù)

    摘要:同時,迭代器有一個方法來向函數(shù)中暫停處拋出一個錯誤,該錯誤依然可以通過函數(shù)內(nèi)部的模塊進(jìn)行捕獲處理。 本文翻譯自:Diving Deeper With ES6 Generators 由于個人能力有限,翻譯中難免有紕漏和錯誤,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...

    jzzlee 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<