协程、asyncio、异步编程
文章目錄
- 1 協(xié)程
- 2 異步編程
- 3.1 事件循環(huán)
- 3.2 async
- 3.3 await
- 3.4 Task對象
1 協(xié)程
協(xié)程不是由操作系統(tǒng)提供,由程序員人為提供(用戶態(tài)上下文切換技術(shù))
協(xié)稱(Coroutine),也可以被稱為微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。簡而言之,其實就是通過一個線程實現(xiàn)代碼塊相互切換執(zhí)行。
實現(xiàn)協(xié)程的幾種方法:
- greenlet、早期模塊
- yield關(guān)鍵字
- asynco裝飾器(py3.4)
- async、await關(guān)鍵字(py3.5)(推薦)
協(xié)程意義
在一個線程中,如果遇到IO等待時間,線程不會等,利用空閑的時間在去干其他事。
2 異步編程
3.1 事件循環(huán)
理解微一個死循環(huán),去檢測并執(zhí)行某些代碼
import asyncio# 生成或獲取一個事件循環(huán) loop = asyncio.get_event_loop()# 將任務(wù)放到 任務(wù)列表 loop.run_until_complete(任務(wù))3.2 async
協(xié)程函數(shù):定義函數(shù)的時候async def 函數(shù)名
協(xié)程對象:執(zhí)行協(xié)程函數(shù)()得到協(xié)程對象
注意:執(zhí)行協(xié)程函數(shù)創(chuàng)建愛協(xié)程對象,函數(shù)內(nèi)部代碼不會執(zhí)行
事件循環(huán)處理函數(shù)內(nèi)部代碼
import asyncio# 協(xié)程對象 async def func():pass # 內(nèi)容不執(zhí)行# 協(xié)程對象 result = func()# 添加事件,幫助執(zhí)行函數(shù)內(nèi)部代碼 py3.4 #loop = asyncio.get_event_loop() #loop.run_until_complete(result)# py3.7 asycio.run(result)3.3 await
await + 可等待對象(協(xié)程對象、Future、Task)
await就是等待對象的值得到結(jié)果之后在繼續(xù)往下走
案例一:
import asyncioasync def func():print("666")# 這里等待2秒,有其他任務(wù)執(zhí)行其他任務(wù),然后繼續(xù)向后執(zhí)行res = await asyncio.sleep(2)print("結(jié)束", res)asyncio.run(func())案例二:
import asyncioasync def others():print("start")await asyncio.sleep(2)print("end")return "返回值"async def func():print("執(zhí)行協(xié)程函數(shù)內(nèi)部代碼")# 遇到IO操作掛起當(dāng)前協(xié)程(任務(wù)),等IO操作完成之后再繼續(xù)往下執(zhí)行。# 當(dāng)前協(xié)程掛起時,事件循環(huán)可以去執(zhí)行其他協(xié)程(任務(wù))res = await others()print("IO請求結(jié)束,結(jié)果為:", res)asyncio.run(func())案例三
import asyncioasync def others():print("start")await asyncio.sleep(2)print("end")return "返回值"async def func():print("執(zhí)行協(xié)程函數(shù)內(nèi)部代碼")# 遇到IO操作掛起當(dāng)前協(xié)程(任務(wù)),等IO操作完成之后再繼續(xù)往下執(zhí)行。# 當(dāng)前協(xié)程掛起時,事件循環(huán)可以去執(zhí)行其他協(xié)程(任務(wù))res1 = await others()print("IO請求結(jié)束,結(jié)果為:", res1)res2 = await others()print("IO請求結(jié)束,結(jié)果為:", res2)asyncio.run(func())3.4 Task對象
-
py3.7
-
在事件循環(huán)中添加多個任務(wù)
-
Task用于并發(fā)調(diào)度協(xié)程,通過asyncio.create_task(協(xié)程對象)的方式創(chuàng)建愛你Task對象,這樣可以讓協(xié)程加入事件循環(huán)中等待被調(diào)度執(zhí)行。除了使用asyncio.create_task()函數(shù)以外,還可以用更低層級的loop_create_task()或ensure_future()函數(shù)。不建議手動實例化Task對象。
參考地址:
https://www.bilibili.com/video/BV1dD4y127bD
總結(jié)
以上是生活随笔為你收集整理的协程、asyncio、异步编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站SEO搜索排版布局优化
- 下一篇: Linux服务器各种后门查杀