Python協(xié)程的四種實現方式總結
一、yield關鍵字實現方式
以yield關鍵字方式實現協(xié)程代碼如下所示:
def fun1(): yield 1 yield from fun2() yield 2 def fun2(): yield 3 yield 4 f1=fun1() for item in f1: print(item)
在上述代碼中,一個Python函數中存在由yiled,就說明為生成器函數,yield類似于普通函數的return,區(qū)別在于yield返回后Python會“記住”返回的位置,在下次返回時就從這個位置處返回。yiled from關鍵字后面跟著也是一個生成器,表示從該生成器返回。
在上述代碼運行后,for循環(huán)就是一個迭代的過程,隨著迭代,每次fun1()生成器就會執(zhí)行一次“yield”。因此,上述函數會輸出1——3——4——2。該端代碼執(zhí)行結果如下所示:
上述代碼,其實并沒有完全的實現協(xié)程,或者說實現的協(xié)程非常牽強。
二、greenlet實現方式
greenlet是一個Python的第三方模塊,使用時需要提前安裝。執(zhí)行命令:
pip install greenlet
即可完成安裝。
greenlet實現協(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()函數生成了一個greenlet對象,在該對象中調用switch()函數即可切換到指定greenlet對象對應的函數中執(zhí)行,因此可以實現協(xié)程操作。
上述代碼執(zhí)行結果如下所示:
三、asyncio實現方式
在Python3.4以后,asyncio是Python的一個內置模塊,因此無需安裝即可調用。使用asyncio模式實現的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為一個裝飾器,使用該裝飾器后,一個函數由普通函數成為了協(xié)程函數。與之前兩種方式相比,這段代碼實現了協(xié)程遇到I/O阻塞時自動的切換。
四、async和await關鍵字實現方式
使用async和await關鍵字的實現方式,是Python3.5版本以后引入的協(xié)程操作方式,這種方式與第三種本質上是相同的,但是由于這兩個關鍵字的引入,因此協(xié)程的實現比起第三種更加簡介。這種實現方式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é)程的實現方式,是Python官方推薦的實現方式,如果Python版本允許,盡量采取這種方式運行。上述代碼執(zhí)行結果如下所示:
到此這篇關于Python協(xié)程的四種實現方式總結的文章就介紹到這了,更多相關Python協(xié)程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用BeautifulSoup4修改網頁內容的實戰(zhàn)記錄
BeautifulSoup除了可以查找和定位網頁內容,還可以修改網頁,下面這篇文章主要給大家介紹了關于Python使用BeautifulSoup4修改網頁內容的相關資料,需要的朋友可以參考下2022-05-05Python中encode和encoding的區(qū)別小結
Python是一種非常流行的高級編程語言,它提供了許多內置函數和庫來方便地處理文本數據,其中,encode和encoding是處理文本編碼的重要概念,本文就來介紹一下Python中encode和encoding的區(qū)別小結,感興趣的可以了解一下2023-11-11