pythonasyncio在哪个版本好_什么情况下需要使用 Python 的 asyncio 模块?
不請自來。
先說什么是Asyncio
Asyncio和其他Pythongig程序同樣是單線程的,只有一個主線程,但是可以進(jìn)行多個不同的task,這個task是一個特殊的future對象,被event loop(事件循環(huán))的對象控制,這里的task, 就相當(dāng)于多線程里面的多個線程
task的任務(wù)狀態(tài)可以簡化為: 1預(yù)備狀態(tài), 當(dāng)前task空閑,隨時可以執(zhí)行; 2.等待狀態(tài), task已經(jīng)在運(yùn)行,等待外部操作完成, 如I/O操作。 event loop 維護(hù)了兩個任務(wù)列表,分別對應(yīng)這兩種狀態(tài), 運(yùn)行時event loop選取運(yùn)行狀態(tài)的一個task并讓其運(yùn)行,知道該task將控制權(quán)交還給event loop。 當(dāng)task將控制權(quán)交換給event loop時,event loop會根據(jù)其是否完成, 將task放到預(yù)備或等待狀態(tài)的列表,然后遍歷等待狀態(tài)列表的task, 查看是否完成如果完成,則將其放到預(yù)備狀態(tài)的列表
如果為完成,作為繼續(xù)放在等待狀態(tài)的列表
原來在預(yù)備狀態(tài)列表的任務(wù)位置仍然不變,因?yàn)樗麄冞€沒有運(yùn)行
當(dāng)所有task被重新放置在合適的列表后, 新一輪的循環(huán)開始,event loop 繼續(xù)從預(yù)備狀態(tài)的列表中選取一個task使其執(zhí)行,如此循環(huán),知道所有task完成
Asyncio運(yùn)行時不會被外部的因素打斷,所以不必?fù)?dān)心線程安全問題
用法
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操作很慢,需要很多任務(wù)/線程協(xié)同實(shí)現(xiàn), 使用asyncio
如果是 I/O 密集型的, 但是I/O很快,只需要有限數(shù)量的任務(wù)/線程,那么使用多線程即可
如果是 CPU 密集型的, 使用多進(jìn)程。
that's all
總結(jié)
以上是生活随笔為你收集整理的pythonasyncio在哪个版本好_什么情况下需要使用 Python 的 asyncio 模块?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net MySQL事物_在ASP.NE
- 下一篇: mysql safe无法启动_(转)my