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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

pythonasyncio在哪个版本好_什么情况下需要使用 Python 的 asyncio 模块?

發布時間:2024/4/20 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythonasyncio在哪个版本好_什么情况下需要使用 Python 的 asyncio 模块? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

不請自來。

先說什么是Asyncio

Asyncio和其他Pythongig程序同樣是單線程的,只有一個主線程,但是可以進行多個不同的task,這個task是一個特殊的future對象,被event loop(事件循環)的對象控制,這里的task, 就相當于多線程里面的多個線程

task的任務狀態可以簡化為: 1預備狀態, 當前task空閑,隨時可以執行; 2.等待狀態, task已經在運行,等待外部操作完成, 如I/O操作。 event loop 維護了兩個任務列表,分別對應這兩種狀態, 運行時event loop選取運行狀態的一個task并讓其運行,知道該task將控制權交還給event loop。 當task將控制權交換給event loop時,event loop會根據其是否完成, 將task放到預備或等待狀態的列表,然后遍歷等待狀態列表的task, 查看是否完成如果完成,則將其放到預備狀態的列表

如果為完成,作為繼續放在等待狀態的列表

原來在預備狀態列表的任務位置仍然不變,因為他們還沒有運行

當所有task被重新放置在合適的列表后, 新一輪的循環開始,event loop 繼續從預備狀態的列表中選取一個task使其執行,如此循環,知道所有task完成

Asyncio運行時不會被外部的因素打斷,所以不必擔心線程安全問題

用法

import asyncio

async def crawl_page(url):

print('crawling{}'.format(url))

sleep_time = int(url.split("_")[-1])

await asyncio.sleep(sleep_time)

print("OK{}".format(url))

async def main(urls):

tasks = [asyncio.create_task(crawl_page(url)) for url in urls]

for task in tasks:

await task

if __name__ == "__main__":

asyncio.run(main(["url_1", "url_2", "url_3", "url_4"]))

output :

crawling url_1

crawling url_2

crawling url_3

crawling url_4

OK url_1

OK url_2

OK url_3

OK url_4

缺陷

由于python版本限制, 很多python目前還不支持Asyncio

使用如果是 I/O 密集型的, 并且I/O操作很慢,需要很多任務/線程協同實現, 使用asyncio

如果是 I/O 密集型的, 但是I/O很快,只需要有限數量的任務/線程,那么使用多線程即可

如果是 CPU 密集型的, 使用多進程。

that's all

總結

以上是生活随笔為你收集整理的pythonasyncio在哪个版本好_什么情况下需要使用 Python 的 asyncio 模块?的全部內容,希望文章能夠幫你解決所遇到的問題。

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