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