中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?asyncio常用函數如何使用

發布時間:2023-03-14 16:36:09 來源:億速云 閱讀:114 作者:iii 欄目:開發技術

這篇文章主要介紹“Python asyncio常用函數如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python asyncio常用函數如何使用”文章能幫助大家解決問題。

協程的定義

需要使用 async def 語句

協程可以做哪些事:

1、等待一個future結果

2、等待另一個協程(產生一個結果或引發一個異常)

3、產生一個結果給正在等它的協程

4、引發一個異常給正在等它的協程

協程的運行

調用協程函數,協程不會開始運行,只是返回一個協程對象

要讓協程對象運行有兩種方式:

1、在另一個已經運行的協程中用await等待它

2、通過ensure_future函數計劃它的執行

只有某線程的loop運行了,協程才可能運行

下面的例子:

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

loop = asyncio.get_event_loop()
loop.run_until_complete(do_some_work(3))

run_until_complete是一個阻塞調用,知道協程運行結束才返回

它的參數是一個future,但是我們傳給它的卻是協程對象,它在內部做了檢查,通過ensure_future函數把協程對象包裝成了future

我們可以這樣寫:

loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))

多個協程運行

多個協程在一個loop里運行,為了把多個協程交給loop,需要借助asyncio.gathre函數

loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))

或者先將協程對象存到list中,這種比較常見

loop = asyncio.get_event_loop() #獲取當前線程loop
coros_list = []
for i in range(2000):
    coros_list.append(main(i))
loop.run_until_complete(asyncio.gather(*coros_list))

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

關于loop.close()

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

loop = asyncio.get_event_loop() #獲取當前線程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.run_until_complete(do_some_work(loop, 3))
loop.close()

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

loop = asyncio.get_event_loop() #獲取當前線程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.close()
loop.run_until_complete(do_some_work(loop, 3))  # 此處異常

回調

加入協程是一個IO的讀操作,等他讀完數據后,我們希望得到通知,以便下一步數據的處理。這個可以向future添加回調實現

def done_callback(futu):
    print('Done')
futu = asyncio.ensure_future(do_some_work(3))
futu.add_done_callback(done_callback)
loop.run_until_complete(futu)

事件循環

事件循環會運行異步任務和回調,執行網絡IO操作,以及運行子進程

從asyncio event loop policy文檔,我們得知, event loop policy是一個進程全局對象,控制對該進程內所有event loop的管理。

進程的全局policy定義了該policy管控的context的含義,在每個context中管理分開獨立的event loop. 默認的policy定義的context就是當前的線程, 也就是說不同的線程是不同的context,因此有不同的event loop。

獲取事件循環

asyncio.get_running_loop() # 返回當前os線程中正在運行的事件循環
asyncio.get_event_loop() # 獲取當前事件循環
asyncio.set_event_loop(loop) # 獲取當前事件循環
asyncio.new_event_loop() # 創建并返回一個新的事件循環對象

asyncio.get_event_loop()

若:

  • 當前線程為主線程

  • 當前線程沒有啟動event loop

調用asyncio.get_event_loop()方法會生成一個新的默認event loop,并設置為當前線程的事件循環。

此時,get_event_loop()相當于:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

關于“Python asyncio常用函數如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大方县| 赞皇县| 苏尼特右旗| 依兰县| 东宁县| 博爱县| 丹棱县| 湖南省| 宣汉县| 河北区| 资兴市| 民乐县| 井冈山市| 正镶白旗| 敦煌市| 偃师市| 抚远县| 台前县| 安徽省| 谢通门县| 精河县| 乐清市| 庐江县| 达尔| 社会| 邵东县| 黔南| 广河县| 拜城县| 陵川县| 虹口区| 嘉善县| 井冈山市| 武强县| 屏东市| 钦州市| 北宁市| 台中市| 铁岭县| 静海县| 长治市|