日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

协程、asyncio、异步编程

發布時間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协程、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 函數名
協程對象:執行協程函數()得到協程對象

# 協程對象 async def func():pass # 內容不執行# 協程對象 result = func()

注意:執行協程函數創建愛協程對象,函數內部代碼不會執行

事件循環處理函數內部代碼

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、异步编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。