一文帶你了解Python協(xié)程的詳細(xì)解釋以及例子
1.協(xié)程
協(xié)程不是計(jì)算機(jī)提供的,計(jì)算機(jī)只提供:進(jìn)程、線程。協(xié)程時(shí)人工創(chuàng)造的一種用戶態(tài)切換的微進(jìn)程,使用一個(gè)線程去來回切換多個(gè)進(jìn)程
實(shí)現(xiàn)協(xié)程的幾種方法
- greenlet:早期模塊
- yield關(guān)鍵字:可以保存代碼,保存狀態(tài)
- asyncio裝飾器(3.4)
- async、await關(guān)鍵字(3.5)【推薦】
1.1greenlet實(shí)現(xiàn)協(xié)程
pip install greenlet from greenlet import greenlet def fun1(): gre2.switch()#切換到fun2 pass def fun2(): gre1.switch()#切換到fun1 pass gre1 = greenlet(func1) gre2 = greenlet(func2) gre1.switch()#先去執(zhí)行fun1
1.2yield關(guān)鍵字實(shí)現(xiàn)協(xié)程
def func1(): yield 1 yield from func2() yield 2 def func2(): yield 3 yield 4 f1 = func1() for item in f1: print(item,end=" ") #打印結(jié)果 1 3 4 2
1.3使用asyncio模塊實(shí)現(xiàn)協(xié)程
再python3.4版本之后才可以用(不用安裝,在標(biāo)準(zhǔn)庫(kù)中)
import asyncio #使用該裝飾器裝飾后,該函數(shù)就是一個(gè)協(xié)程函數(shù) @asyncio.coroutine def func1(): print(1) #遇到IO操作時(shí),會(huì)自動(dòng)切換到taks中的其他任務(wù)函數(shù) yield from asyncio.sleep(2) print(2) @asyncio.coroutine def func2(): print(3) yield from asyncio.sleep(2) print(4) #將兩個(gè)協(xié)程函數(shù)封裝成一個(gè)tasks列表 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] # loop = asyncio.get_event_loop() loop.run_until_complete(func1())
1.4async & await關(guān)鍵字實(shí)現(xiàn)協(xié)程
import asyncio #使用該裝飾器裝飾后,該函數(shù)就是一個(gè)協(xié)程函數(shù) async def func1(): print(1) #遇到IO操作時(shí),會(huì)自動(dòng)切換到tasks中的其他任務(wù)函數(shù) await asyncio.sleep(2) print(2) async def func2(): print(3) await asyncio.sleep(2) print(4) #將兩個(gè)協(xié)程函數(shù)封裝成一個(gè)tasks列表 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(tasks)
2.協(xié)程意義
在線程中如果遇到IO等待時(shí)間,線程不會(huì)傻等著,會(huì)利用空閑的時(shí)間去做其他事情,也就是進(jìn)程異步執(zhí)行。
#協(xié)程請(qǐng)求資源使用第三方庫(kù)aiohttp import aiohttp
3.異步編程
3.1時(shí)間循環(huán)
理解成一個(gè)死循環(huán),去檢測(cè)并執(zhí)行某些代碼
#偽代碼 任務(wù)列表 = [task1,task2...] while True: for 就緒任務(wù) in 可執(zhí)行任務(wù)列表: 執(zhí)行 for 已完成任務(wù) in 已完成任務(wù)列表: 從任務(wù)列表中刪除 import asyncio #生成一個(gè)書簡(jiǎn)循環(huán) loop = asyncio.get_event_loop() #將任務(wù)放到任務(wù)列表中 loop.run_until_complete(任務(wù))
3.2案例
協(xié)程函數(shù),
定義函數(shù)的時(shí)候,用async def 函數(shù)名
協(xié)程對(duì)象:執(zhí)行協(xié)程函數(shù)的時(shí)候得到一個(gè)協(xié)程對(duì)象
async def func(): pass result = func()
注意:執(zhí)行協(xié)程函數(shù)時(shí)得到的協(xié)程對(duì)象,函數(shù)內(nèi)部代碼不會(huì)執(zhí)行
import asyncio async def func(): print("哈嘍") f = func()#協(xié)程對(duì)象 loop = asyncio.get_event_loop()#創(chuàng)建循環(huán)對(duì)象 loop.run_until_complete(f)#通過循環(huán)對(duì)象執(zhí)行協(xié)程對(duì)象 #python3.7可以直接 asyncio.run(f)
3.3await關(guān)鍵字
await + 可等待的對(duì)象 {協(xié)程對(duì)象,F(xiàn)uture對(duì)象,Task對(duì)象} (類似于I O 等待)
import asyncio async def func(): print("哈嘍") re = await asyncio.sleep(2) print(re) asyncio.run(func())
await就是等待對(duì)象的值得到結(jié)果后再繼續(xù)向下執(zhí)行
import asyncio async def other(): print("start") await asyncio.sleep(2) print("end") return 1 async def fun(): print("執(zhí)行協(xié)程函數(shù)內(nèi)部代碼") #遇到IO操作時(shí)會(huì)掛起當(dāng)前協(xié)程任務(wù),等IO操作完成后再繼續(xù)往下執(zhí)行,當(dāng)前協(xié)程掛起時(shí),時(shí)間循環(huán)對(duì)象可以執(zhí)行其他協(xié)程任務(wù) re = await other() print("IO請(qǐng)求結(jié)束,結(jié)果為:",re) asyncio.run(func())
執(zhí)行結(jié)果
執(zhí)行協(xié)程函數(shù)內(nèi)部代碼
start
end
IO請(qǐng)求結(jié)束,結(jié)果為: 1
到此這篇關(guān)于一文帶你了解Python協(xié)程的詳細(xì)解釋以及例子的文章就介紹到這了,更多相關(guān)Python協(xié)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas解決數(shù)據(jù)缺失、重復(fù)的方法與實(shí)踐過程
這篇文章主要介紹了pandas解決數(shù)據(jù)缺失、重復(fù)的方法與實(shí)踐過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Python中的五個(gè)神仙級(jí)函數(shù)一起來看看
這篇文章主要為大家介紹了Python中的五個(gè)神仙級(jí)函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01python 多進(jìn)程通信模塊的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了python 多進(jìn)程通信模塊的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02使用python將時(shí)間轉(zhuǎn)換為指定的格式方法
今天小編就為大家分享一篇使用python將時(shí)間轉(zhuǎn)換為指定的格式方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11對(duì)python3標(biāo)準(zhǔn)庫(kù)httpclient的使用詳解
今天小編就為大家分享一篇對(duì)python3標(biāo)準(zhǔn)庫(kù)httpclient的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12