淺析Python中的asyncio

asyncio理解

最近突然想了解一下Python的異步編程,于是乎就去了解了下asyncio的使用。借用官網的話

成都創新互聯是一家集網站建設,秦皇島企業網站建設,秦皇島品牌網站建設,網站定制,秦皇島網站建設報價,網絡營銷,網絡優化,秦皇島網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

asyncio 是用來編寫并發代碼的庫,使用 async/await 語法。其用作多個提供高性能 Python 異步框架的基礎,包括網絡和網站服務,數據庫連接庫,分布式任務隊列等等。

要理解Python的異步編程方式這里我直接上例子

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

main()

運行結果

RuntimeWarning: coroutine 'main' was never awaited

可以看到對于加了async的方法直接調用是無法運行出結果的,這是因為async修飾的函數其運行的返回結果是一個coroutine對象,而coroutine對象需要放到Event Loop中才能執行。

所以我們把上述代碼改成

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

asyncio.run(main())

運行結果

Hello ...
... World!

這樣我們就解決了coroutine的運行問題。下面我們再來嘗試實現一下異步程序,看代碼

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")
    await say_after(1, 'hello')
    await say_after(2, 'world')
    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

運行結果按道理應該是間隔了3s,可是結果如下

started at 14:07:43
hello
world
finished at 14:07:46

這是為什么呢?查閱一番資料發現Python中的異步執行模式依賴于Event Loop,在等待的間隙中需要從Event Loop中找其它可以運行的程序,await關鍵字就是將coroutine轉化成一個task加入到Event Loop中去,而執行第一個say_after的時候,第二個say_after并沒有加入到Event Loop中去,所以在第一個say_after等待的時候無法去執行第二個say_after,最終導致的結果就是程序運行了3s,并沒有達到異步的效果。

有兩種方式解決這個問題

1、提前將兩個say_after加入到eventloop中

async def main():
    task1 = asyncio.create_task(say_after(1, 'hello'))
    task2 = asyncio.create_task(say_after(2, 'world'))
    print(f"started at {time.strftime('%X')}")
    await task1
    await task2
    print(f"finished at {time.strftime('%X')}")

2、使用gather方法

async def main():
    print(f"started at {time.strftime('%X')}")
    await asyncio.gather(
        say_after(1, 'hello'),
        say_after(2, 'world')
    )
    print(f"finished at {time.strftime('%X')}")

最后二者的運行結果都是間隔了2s

started at 14:17:43
hello
world
finished at 14:17:45

最后,需要提醒的是,對于Python的asyncio來說,無論何時都只有1條語句運行在cpu上,所以如果我們的程序沒有等待的時候,asyncio其實并沒有什么幫助。

參考資料

Python官方文檔
B站大佬講解

網頁標題:淺析Python中的asyncio
當前URL:http://m.kartarina.com/article30/dsogjpo.html

成都網站建設公司_創新互聯,為您提供微信公眾號品牌網站設計網站收錄云服務器軟件開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化
主站蜘蛛池模板: 在线观看无码AV网址| 亚洲中文字幕无码mv| 久久老子午夜精品无码| 亚洲AV永久青草无码精品| 无码一区18禁3D| 久久午夜无码鲁丝片午夜精品| 无码137片内射在线影院| 麻豆亚洲AV成人无码久久精品| 高h纯肉无码视频在线观看| 无码射肉在线播放视频| 久久久无码一区二区三区| 少妇中文无码高清| 人妻少妇精品无码专区漫画| 综合无码一区二区三区| 日韩精品成人无码专区免费| 无码GOGO大胆啪啪艺术| 久久无码AV中文出轨人妻| 国产精品国产免费无码专区不卡| 色噜噜综合亚洲av中文无码| 性无码专区一色吊丝中文字幕| 中文字幕无码乱码人妻系列蜜桃| 国产精品无码午夜福利| 成人无码视频97免费| 亚洲日韩精品无码专区加勒比| 无码精品人妻一区二区三区免费看 | 无码H黄肉动漫在线观看网站| 东京热加勒比无码视频| 国产精品无码aⅴ嫩草| 无码喷水一区二区浪潮AV| 国产成人无码AV片在线观看| 亚洲AV无码国产精品永久一区| 69堂人成无码免费视频果冻传媒| 国产V亚洲V天堂无码| 亚洲日韩乱码中文无码蜜桃臀网站| 久久无码精品一区二区三区| 亚洲伊人成无码综合网| 亚洲AV无码一区二三区 | 精品无码一区二区三区电影 | 亚洲av午夜精品无码专区| 精品久久久无码21p发布| 天堂一区人妻无码|