您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python協程怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python協程怎么實現”吧!
協程不是計算機提供的,計算機只提供:進程、線程。協程時人工創造的一種用戶態切換的微進程,使用一個線程去來回切換多個進程
實現協程的幾種方法
greenlet:早期模塊
yield關鍵字:可以保存代碼,保存狀態
asyncio裝飾器(3.4)
async、await關鍵字(3.5)【推薦】
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()#先去執行fun1
def func1(): yield 1 yield from func2() yield 2 def func2(): yield 3 yield 4 f1 = func1() for item in f1: print(item,end=" ") #打印結果 1 3 4 2
再python3.4版本之后才可以用(不用安裝,在標準庫中)
import asyncio #使用該裝飾器裝飾后,該函數就是一個協程函數 @asyncio.coroutine def func1(): print(1) #遇到IO操作時,會自動切換到taks中的其他任務函數 yield from asyncio.sleep(2) print(2) @asyncio.coroutine def func2(): print(3) yield from asyncio.sleep(2) print(4) #將兩個協程函數封裝成一個tasks列表 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] # loop = asyncio.get_event_loop() loop.run_until_complete(func1())
import asyncio #使用該裝飾器裝飾后,該函數就是一個協程函數 async def func1(): print(1) #遇到IO操作時,會自動切換到tasks中的其他任務函數 await asyncio.sleep(2) print(2) async def func2(): print(3) await asyncio.sleep(2) print(4) #將兩個協程函數封裝成一個tasks列表 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(tasks)
在線程中如果遇到IO等待時間,線程不會傻等著,會利用空閑的時間去做其他事情,也就是進程異步執行。
#協程請求資源使用第三方庫aiohttp import aiohttp
理解成一個死循環,去檢測并執行某些代碼
#偽代碼 任務列表 = [task1,task2...] while True: for 就緒任務 in 可執行任務列表: 執行 for 已完成任務 in 已完成任務列表: 從任務列表中刪除 import asyncio #生成一個書簡循環 loop = asyncio.get_event_loop() #將任務放到任務列表中 loop.run_until_complete(任務)
協程函數,
定義函數的時候,用async def 函數名
協程對象:執行協程函數的時候得到一個協程對象
async def func(): pass result = func()
注意:執行協程函數時得到的協程對象,函數內部代碼不會執行
import asyncio async def func(): print("哈嘍") f = func()#協程對象 loop = asyncio.get_event_loop()#創建循環對象 loop.run_until_complete(f)#通過循環對象執行協程對象 #python3.7可以直接 asyncio.run(f)
await + 可等待的對象 {協程對象,Future對象,Task對象} (類似于I O 等待)
import asyncio async def func(): print("哈嘍") re = await asyncio.sleep(2) print(re) asyncio.run(func())
await就是等待對象的值得到結果后再繼續向下執行
import asyncio async def other(): print("start") await asyncio.sleep(2) print("end") return 1 async def fun(): print("執行協程函數內部代碼") #遇到IO操作時會掛起當前協程任務,等IO操作完成后再繼續往下執行,當前協程掛起時,時間循環對象可以執行其他協程任務 re = await other() print("IO請求結束,結果為:",re) asyncio.run(func())
執行結果
執行協程函數內部代碼
start
end
IO請求結束,結果為: 1
感謝各位的閱讀,以上就是“Python協程怎么實現”的內容了,經過本文的學習后,相信大家對Python協程怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。