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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python asyncio_Python 的异步 IO:Asyncio 简介

發布時間:2025/3/19 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python asyncio_Python 的异步 IO:Asyncio 简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原標題:Python 的異步 IO:Asyncio 簡介

Python 的 asyncio 類似于 C++ 的 Boost.Asio。

異步 IO,就是你發起一個 IO 操作,不用等它結束,可以繼續做其他事情,當它結束時,你會得到通知。

Asyncio 是并發(concurrency)的一種方式。對 Python 來說,并發還可以通過線程(threading)和多進程(multiprocessing)來實現。

Asyncio 并不能帶來真正的并行(parallelism)。當然,因為 GIL(全局解釋器鎖)的存在,Python 的多線程也不能帶來真正的并行。

可交給 asyncio 執行的任務,稱為協程(coroutine)。一個協程可以放棄執行,把機會讓給其它協程(即 yield from 或 await)。

定義協程

協程的定義,需要使用 async def 語句。

do_some_work 便是一個協程。

準確來說,do_some_work 是一個協程函數,可以通過 asyncio.iscoroutinefunction 來驗證:

這個協程什么都沒做,我們讓它睡眠幾秒,以模擬實際的工作量 :

在解釋 await 之前,有必要說明一下協程可以做哪些事。協程可以:

asyncio.sleep 也是一個協程,所以 await asyncio.sleep(x) 就是等待另一個協程。可參見 asyncio.sleep 的文檔:

運行協程

調用協程函數,協程并不會開始運行,只是返回一個協程對象,可以通過 asyncio.iscoroutine 來驗證:

此處還會引發一條警告:

要讓這個協程對象運行的話,有兩種方式:

簡單來說,只有 loop 運行了,協程才可能運行。

下面先拿到當前線程缺省的 loop ,然后把協程對象交給 loop.run_until_complete,協程對象隨后會在 loop 里得到運行。

run_until_complete 是一個阻塞(blocking)調用,直到協程運行結束,它才返回。這一點從函數名不難看出。

run_until_complete 的參數是一個 future,但是我們這里傳給它的卻是協程對象,之所以能這樣,是因為它在內部做了檢查,通過 ensure_future 函數把協程對象包裝(wrap)成了 future。所以,我們可以寫得更明顯一些:

完整代碼:

運行結果:

回調

假如協程是一個 IO 的讀操作,等它讀完數據后,我們希望得到通知,以便下一步數據的處理。這一需求可以通過往 future 添加回調來實現。

多個協程

實際項目中,往往有多個協程,同時在一個 loop 里運行。為了把多個協程交給 loop,需要借助 asyncio.gather 函數。

或者先把協程存在列表里:

運行結果:

這兩個協程是并發運行的,所以等待的時間不是 1 + 3 = 4 秒,而是以耗時較長的那個協程為準。

參考函數 gather 的文檔:

發現也可以傳 futures 給它:

gather 起聚合的作用,把多個 futures 包裝成單個 future,因為 loop.run_until_complete 只接受單個 future。

run_until_complete 和 run_forever

我們一直通過 run_until_complete 來運行 loop ,等到 future 完成,run_until_complete 也就返回了。

輸出:

現在改用 run_forever:

輸出:

三秒鐘過后,future 結束,但是程序并不會退出。run_forever 會一直運行,直到 stop 被調用,但是你不能像下面這樣調 stop:

run_forever 不返回,stop 永遠也不會被調用。所以,只能在協程中調 stop:

這樣并非沒有問題,假如有多個協程在 loop 里運行:

第二個協程沒結束,loop 就停止了——被先結束的那個協程給停掉的。

要解決這個問題,可以用 gather 把多個協程合并成一個 future,并添加回調,然后在回調里再去停止 loop。

其實這基本上就是 run_until_complete 的實現了,run_until_complete 在內部也是調用 run_forever。

Close Loop?

以上示例都沒有調用 loop.close,好像也沒有什么問題。所以到底要不要調 loop.close 呢?

簡單來說,loop 只要不關閉,就還可以再運行。:

但是如果關閉了,就不能再運行了:

建議調用 loop.close,以徹底清理 loop 對象防止誤用。

gather vs. wait

asyncio.gather 和 asyncio.wait 功能相似。

具體差別可請參見 StackOverflow 的討論:Asyncio.gather vs asyncio.wait。

Timer

C++ Boost.Asio 提供了 IO 對象 timer,但是 Python 并沒有原生支持 timer,不過可以用 asyncio.sleep 模擬。

*聲明:推送內容及圖片來源于網絡,部分內容會有所改動,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。

責任編輯:

總結

以上是生活随笔為你收集整理的python asyncio_Python 的异步 IO:Asyncio 简介的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧色丰满女同hd | 午夜精品久久久久久久久 | 91麻豆精品久久久久蜜臀 | 亚洲色图网友自拍 | 差差差30分钟 | 男女涩涩网站 | 国产网友自拍 | 免费观看一区 | 一区二区黄色 | 樱空桃在线 | 自拍在线视频 | 亚洲AV成人无码一二三区在线 | 无码一区二区三区在线观看 | 在线播放av片 | 在线观看中文字幕亚洲 | av福利在线免费观看 | 亚洲在线观看一区二区 | 青青青手机视频在线观看 | 国产精品毛片久久 | 日韩av成人网 | 久久99国产精品久久99果冻传媒 | 欧美日韩激情在线一区二区三区 | 中文字幕乱码无码人妻系列蜜桃 | 久久久精品久 | 五月激情片| 日本亚洲最大的色成网站www | 日韩精品一区二区三区视频在线观看 | 玩弄丰满少妇xxxxx性多毛 | 国产午夜视频在线播放 | 年代下乡啪啪h文 | 国内激情自拍 | 朋友人妻少妇精品系列 | 在线黄色免费网站 | 精品自拍偷拍视频 | av女星全部名单 | 色一情一区二区三区四区 | 国产精品久久久久永久免费看 | 中文字幕在线视频免费观看 | 伊人春色影院 | 国产91精品久久久 | 16一17女人毛片 | 波多野结衣免费视频观看 | 欧美a在线播放 | 国产美女精品久久 | 欧美激情电影一区二区 | 可以免费看黄的网站 | 成人香蕉视频在线观看 | 日本少妇在线 | 国产三级做爰高清在线 | 亚洲欧美日本一区二区三区 | 午夜精品久久久久久久久久蜜桃 | 福利视频网站 | 99成人免费视频 | 久久最新网址 | 日韩国产传媒 | 五月天中文字幕 | 播色网| 婷婷91 | 久久亚洲国产 | 久草视频在线播放 | 欧美伦乱 | 一区精品视频在线观看 | 国产传媒视频在线观看 | 国产乱国产乱老熟300部视频 | 草草影院发布页 | 毛片入口| 精品国产乱码久久久久久图片 | 蜜臀久久99精品久久久久宅男 | 日韩一级影视 | 熟妇一区二区三区 | 激情文学亚洲色图 | 青青草97国产精品免费观看 | 超碰久操 | 久色视频在线播放 | 一色道久久88加勒比一 | 寂寞午夜影院 | 国产精品一区二区三区免费在线观看 | 色香天天 | 欧美极品在线观看 | 99色影院| 女仆乖h调教跪趴1v1 | 亚洲久久视频 | 亚洲欧美bt | 欧美瑟瑟 | 日本亲子乱子伦xxxx50路 | 狠狠干老司机 | avtt中文字幕 | 国产欧美一区二区在线观看 | 国产精品二区一区二区aⅴ污介绍 | 亚洲三区在线观看无套内射 | 无码一区二区三区 | 在线观看免费看片 | 欧美在线观看网站 | 国精品一区 | 色综合狠狠爱 | 国产黄色视屏 | 成人av一区二区三区在线观看 | 老牛影视av牛牛影视av | 台湾佬综合网 |