首頁  >  文章  >  後端開發  >  如何使用Python的asyncio常用函數?

如何使用Python的asyncio常用函數?

WBOY
WBOY轉載
2023-04-26 20:10:061635瀏覽

協程的定義

需要使用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常用函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除