成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

yacheng / 1454人閱讀

摘要:協(xié)程是用來處理阻塞和流程阻塞這兩個(gè)普世問題的得力工具,可以達(dá)到比較好的。這段代碼執(zhí)行的輸出是通過這個(gè)例子,可以了解到的的兩個(gè)特性。被調(diào)用一次,函數(shù)就往前執(zhí)行一步。通過控制,可以從外面控制函數(shù)內(nèi)部的執(zhí)行進(jìn)度。

很多碼農(nóng)終其一生可能在代碼上干的事情無非就是追求兩件事情:Logic Locality 和 Data Locality。前者決定了開發(fā)效率,后者決定了運(yùn)行效率。協(xié)程是用來處理I/O阻塞和流程阻塞這兩個(gè)普世問題的得力工具,可以達(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

通過這個(gè)例子,可以了解到Python的generator的兩個(gè)特性。
首先,demo_before_and_after()的時(shí)候,before并沒有被打印出來。說明demo_before_and_after這個(gè)函數(shù)在這個(gè)時(shí)候還沒有真正開始執(zhí)行。gen.next()被調(diào)用一次,函數(shù)就往前執(zhí)行一步。通過控制gen.next(),可以從外面控制函數(shù)內(nèi)部的執(zhí)行進(jìn)度。
其次,Python的generator沒有類似Java的Iterator.hasNext這樣的設(shè)計(jì),直接以拋出StopIteration來傳達(dá)“到尾巴了”這個(gè)消息。

利用generator這個(gè)特性,Python的標(biāo)準(zhǔn)庫提供了一個(gè)非常方便的contextmanager的設(shè)計(jì)

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

很多需要獲得資源,使用資源,然后確保資源被正確釋放的場(chǎng)合(類似C++的RAII),都可以用上面的寫法來實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37382.html

相關(guān)文章

  • generator101】 - generator輸入與輸出

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

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

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

    894974231 評(píng)論0 收藏0
  • generator101】 - 對(duì)比generator和greenlet

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

    CoyPan 評(píng)論0 收藏0
  • generator101】 - yield from

    摘要:我們可以看一下的可見是由內(nèi)部支持的,其實(shí)現(xiàn)原理上就避免了棧進(jìn)棧出的消耗,直接由最內(nèi)層的返回值。另外可以實(shí)現(xiàn)外部直接向最內(nèi)層的傳遞值,比如這段代碼的輸出是這樣傳值的方式,在用循環(huán)重新的模式下是無法實(shí)現(xiàn)的。這也就是必須使用,而不能使用的原因。 在python 3.3里,generator新增了一個(gè)語法 yield from 這個(gè)yield from的作用是什么?看下面兩段對(duì)比的代碼: d...

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

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

    jzzlee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<