摘要:的是可以有輸入輸出的,這個(gè)特性并不廣為人知。也就是要求不返回值,而是拋出給定的異常。執(zhí)行之后的輸出與前面是一樣的。
Python的generator是可以有輸入輸出的,這個(gè)特性并不廣為人知。這其實(shí)是一個(gè)挺有用的特性,利用其外部可控制執(zhí)行進(jìn)度的特性,再加上可以與外部進(jìn)行輸入輸出,generator可以被用來(lái)打造成一個(gè)異步執(zhí)行框架,或者說(shuō)是協(xié)程調(diào)度引擎。
我們先來(lái)看一個(gè)最簡(jiǎn)單的例子,generator如何接受外部的輸入
def demo_input_and_output(): input = yield "please give me a input" yield input gen = demo_input_and_output() print(gen.next()) print(gen.send("this is your input"))
這段代碼的輸出是
please give me a input this is your input
其中第一個(gè)gen.next()是執(zhí)行第一個(gè)yield,第二個(gè)gen.send是給第一個(gè)yield一個(gè)返回值,也就是外部傳遞給generator的輸入,同時(shí)執(zhí)行第二個(gè)yield。我們可以把next()理解為一種特殊情況的send(),也就是給的輸入是None,下面是一段等價(jià)的代碼:
def demo_input_and_output(): input = yield "please give me a input" yield input gen = demo_input_and_output() print(gen.send(None)) print(gen.send("this is your input"))
輸入除了值之外,還可以是異常。也就是要求yield不返回值,而是拋出給定的異常。
def demo_input_and_output(): try: yield "please give me a input" except RuntimeError as e: yield e.message gen = demo_input_and_output() print(gen.next()) print(gen.throw(RuntimeError, RuntimeError("this is your input")))
執(zhí)行之后的輸出與前面是一樣的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37380.html
摘要:比如里可以直接把執(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 ...
摘要:協(xié)程是用來(lái)處理阻塞和流程阻塞這兩個(gè)普世問(wèn)題的得力工具,可以達(dá)到比較好的。這段代碼執(zhí)行的輸出是通過(guò)這個(gè)例子,可以了解到的的兩個(gè)特性。被調(diào)用一次,函數(shù)就往前執(zhí)行一步。通過(guò)控制,可以從外面控制函數(shù)內(nèi)部的執(zhí)行進(jìn)度。 很多碼農(nóng)終其一生可能在代碼上干的事情無(wú)非就是追求兩件事情:Logic Locality 和 Data Locality。前者決定了開(kāi)發(fā)效率,后者決定了運(yùn)行效率。協(xié)程是用來(lái)處理I/O...
摘要:我們可以看一下的可見(jiàn)是由內(nèi)部支持的,其實(shí)現(xiàn)原理上就避免了棧進(jìn)棧出的消耗,直接由最內(nèi)層的返回值。另外可以實(shí)現(xiàn)外部直接向最內(nèi)層的傳遞值,比如這段代碼的輸出是這樣傳值的方式,在用循環(huán)重新的模式下是無(wú)法實(shí)現(xiàn)的。這也就是必須使用,而不能使用的原因。 在python 3.3里,generator新增了一個(gè)語(yǔ)法 yield from 這個(gè)yield from的作用是什么?看下面兩段對(duì)比的代碼: d...
摘要:定義列表生成器有兩種方式,一種是算式列表生成器我起的名字,一種通過(guò)關(guān)鍵詞。算式列表生成器算式列表生成器雨列表生成式類似,但需要換成。我們可以用一個(gè)包含關(guān)鍵字的函數(shù)來(lái)定義一個(gè)列表生成器。 通過(guò)列表生成式我們可以方便的生成列表。但是在有的時(shí)候,我們需要生成的列表非常長(zhǎng),而我們的計(jì)算機(jī)的內(nèi)存是有限的。在操作列表的時(shí)候,我們往往只是操作了列表的一部分區(qū)域的數(shù)據(jù)。 例如我們需要生成這么一個(gè)列表,...
摘要:如果說(shuō)相比來(lái)說(shuō),是一種隱式的協(xié)程的話,提供的就更加隱式了。通過(guò)調(diào)用可以知道這個(gè)鏈表目前的大小。正式因?yàn)闆](méi)有把底層的協(xié)程直接控制接口開(kāi)放,而是強(qiáng)買強(qiáng)賣了一個(gè),所以想要在像那樣隨心所欲的操縱協(xié)程還是頗費(fèi)一番周折的。 如果說(shuō)greenlet相比generator來(lái)說(shuō),是一種隱式的協(xié)程的話,stackless python提供的api就更加隱式了。 import stackless def...
閱讀 3666·2021-10-12 10:11
閱讀 1029·2021-09-22 15:42
閱讀 3481·2019-08-30 13:06
閱讀 917·2019-08-29 17:05
閱讀 1663·2019-08-29 12:21
閱讀 2392·2019-08-29 11:31
閱讀 1149·2019-08-23 18:37
閱讀 1270·2019-08-23 14:58