您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python協(xié)程的四種實(shí)現(xiàn)方式是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python協(xié)程的四種實(shí)現(xiàn)方式是什么”吧!
以yield關(guān)鍵字方式實(shí)現(xiàn)協(xié)程代碼如下所示:
def fun1(): yield 1 yield from fun2() yield 2 def fun2(): yield 3 yield 4 f1=fun1() for item in f1: print(item)
在上述代碼中,一個(gè)Python函數(shù)中存在由yiled,就說明為生成器函數(shù),yield類似于普通函數(shù)的return,區(qū)別在于yield返回后Python會(huì)“記住”返回的位置,在下次返回時(shí)就從這個(gè)位置處返回。yiled from關(guān)鍵字后面跟著也是一個(gè)生成器,表示從該生成器返回。
在上述代碼運(yùn)行后,for循環(huán)就是一個(gè)迭代的過程,隨著迭代,每次fun1()生成器就會(huì)執(zhí)行一次“yield”。因此,上述函數(shù)會(huì)輸出1——3——4——2。該端代碼執(zhí)行結(jié)果如下所示:
上述代碼,其實(shí)并沒有完全的實(shí)現(xiàn)協(xié)程,或者說實(shí)現(xiàn)的協(xié)程非常牽強(qiáng)。
greenlet是一個(gè)Python的第三方模塊,使用時(shí)需要提前安裝。執(zhí)行命令:
pip install greenlet
即可完成安裝。
greenlet實(shí)現(xiàn)協(xié)程代碼如下所示:
from greenlet import greenlet def fun1(): print(1) gr2.switch() print(2) gr2.switch() def fun2(): print(3) gr1.switch() print(4) gr1=greenlet(fun1) gr2=greenlet(fun2) gr1.switch()
在上述代碼中,greenlet()函數(shù)生成了一個(gè)greenlet對(duì)象,在該對(duì)象中調(diào)用switch()函數(shù)即可切換到指定greenlet對(duì)象對(duì)應(yīng)的函數(shù)中執(zhí)行,因此可以實(shí)現(xiàn)協(xié)程操作。
上述代碼執(zhí)行結(jié)果如下所示:
在Python3.4以后,asyncio是Python的一個(gè)內(nèi)置模塊,因此無需安裝即可調(diào)用。使用asyncio模式實(shí)現(xiàn)的Python代碼如下所示:
import asyncio @asyncio.coroutine def fun1(): print(1) yield from asyncio.sleep(2) print(2) @asyncio.coroutine def fun2(): print(3) yield from asyncio.sleep(2) print(4) tasks=[ asyncio.ensure_future(fun1()), asyncio.ensure_future(fun2()) ] loop=asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks))
在上述代碼中,@asyncio.coroutin為一個(gè)裝飾器,使用該裝飾器后,一個(gè)函數(shù)由普通函數(shù)成為了協(xié)程函數(shù)。與之前兩種方式相比,這段代碼實(shí)現(xiàn)了協(xié)程遇到I/O阻塞時(shí)自動(dòng)的切換。
使用async和await關(guān)鍵字的實(shí)現(xiàn)方式,是Python3.5版本以后引入的協(xié)程操作方式,這種方式與第三種本質(zhì)上是相同的,但是由于這兩個(gè)關(guān)鍵字的引入,因此協(xié)程的實(shí)現(xiàn)比起第三種更加簡介。這種實(shí)現(xiàn)方式Python代碼如下所示:
import asyncio async def fun1(): print(1) await asyncio.sleep(2) print(2) async def fun2(): print(3) await asyncio.sleep(2) print(4) tasks=[ asyncio.ensure_future(fun1()), asyncio.ensure_future(fun2()) ] loop=asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks))
這種協(xié)程的實(shí)現(xiàn)方式,是Python官方推薦的實(shí)現(xiàn)方式,如果Python版本允許,盡量采取這種方式運(yùn)行。上述代碼執(zhí)行結(jié)果如下所示:
到此,相信大家對(duì)“Python協(xié)程的四種實(shí)現(xiàn)方式是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。