Python協(xié)程的四種實(shí)現(xiàn)方式總結(jié)
一、yield關(guān)鍵字實(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實(shí)現(xiàn)方式
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é)果如下所示:

三、asyncio實(shí)現(xiàn)方式
在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)方式
使用async和await關(guān)鍵字的實(shí)現(xiàn)方式,是Python3.5版本以后引入的協(xié)程操作方式,這種方式與第三種本質(zhì)上是相同的,但是由于這兩個(gè)關(guān)鍵字的引入,因此協(xié)程的實(shí)現(xiàn)比起第三種更加簡(jiǎ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é)果如下所示:

到此這篇關(guān)于Python協(xié)程的四種實(shí)現(xiàn)方式總結(jié)的文章就介紹到這了,更多相關(guān)Python協(xié)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python新建項(xiàng)目自動(dòng)添加介紹和utf-8編碼的方法
這篇文章主要介紹了Python新建項(xiàng)目自動(dòng)添加介紹和utf-8編碼的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Python通過Selenium獲取Web頁(yè)面信息的全指南
Selenium?是一個(gè)功能強(qiáng)大的自動(dòng)化測(cè)試工具,但它也可以用于?web?頁(yè)面信息的抓取和分析,下面小編就來和大家詳細(xì)介紹一下具體是實(shí)現(xiàn)方法吧2025-04-04
Python數(shù)據(jù)序列化技術(shù)總結(jié)
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)序列化是一個(gè)關(guān)鍵環(huán)節(jié),它允許我們將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為可存儲(chǔ)或可傳輸?shù)母袷?,Python提供了多種數(shù)據(jù)序列化技術(shù),每種技術(shù)都有其獨(dú)特的性能優(yōu)勢(shì)和適用場(chǎng)景,本文將詳細(xì)介紹幾種強(qiáng)大的Python數(shù)據(jù)序列化技術(shù),需要的朋友可以參考下2025-03-03
python實(shí)現(xiàn)將文件名批量命名為四位數(shù)or五位數(shù)
這篇文章主要介紹了python實(shí)現(xiàn)將文件名批量命名為四位數(shù)or五位數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Jupyter Notebook如何導(dǎo)入python文件時(shí)的問題
這篇文章主要介紹了Jupyter Notebook如何導(dǎo)入python文件時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Python運(yùn)行出現(xiàn)DeprecationWarning的問題及解決
這篇文章主要介紹了Python運(yùn)行出現(xiàn)DeprecationWarning的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Python3實(shí)現(xiàn)計(jì)算兩個(gè)數(shù)組的交集算法示例
這篇文章主要介紹了Python3實(shí)現(xiàn)計(jì)算兩個(gè)數(shù)組的交集算法,結(jié)合2個(gè)實(shí)例形式總結(jié)分析了Python3針對(duì)數(shù)組的遍歷、位運(yùn)算以及元素的添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04

