事件迴圈

原始碼: Lib/asyncio/events.pyLib/asyncio/base_events.py


前言

事件迴圈是每個 asyncio 應用程式的核心。事件迴圈執行非同步任務和回呼、執行網路 IO 操作並啟動子行程。

應用程式開發人員通常應使用高階的 asyncio 函式,例如 asyncio.run(),並且很少需要參照事件迴圈物件或呼叫其方法。本節主要針對那些需要更細粒度控制事件迴圈行為的低階程式碼、函式庫和框架的作者。

取得事件迴圈

以下的低階函式可用於取得、設置或建立事件迴圈:

asyncio.get_running_loop()

在目前作業系統執行緒中回傳正在運行的事件迴圈。

如果沒有運行的事件迴圈,則引發 RuntimeError

此函式只能從協程或回呼函式中呼叫。

在 3.7 版被加入.

asyncio.get_event_loop()

取得目前的事件迴圈。

當從協程或回呼函式呼叫此函式(例如,使用 call_soon 或類似的 API 於排程呼叫),此函式將永遠回傳正在運行的事件迴圈。

如果沒有設定正在運行的事件迴圈,該函式將回傳 get_event_loop_policy().get_event_loop() 呼叫的結果。

由於此函式具有相當複雜的行為(尤其是在使用自訂事件迴圈策略時),在協程和回呼函式中,建議使用 get_running_loop() 函式,而不是 get_event_loop()

如上所述,可以考慮使用高階的 asyncio.run() 函式,而不是使用這些較低階的函式手動建立和關閉事件迴圈。

在 3.14 版的變更: 如果沒有目前的事件迴圈,則引發 RuntimeError

備註

asyncio 的政策系統已被棄用,並將於 Python 3.16 中移除;此後,此函式將回傳目前執行中的事件迴圈(若存在),否則將回傳由 set_event_loop() 設定的迴圈。

asyncio.set_event_loop(loop)

loop 設置為目前 OS 執行緒的目前事件迴圈。

asyncio.new_event_loop()

建立並回傳新的事件迴圈物件。

請注意 get_event_loop()set_event_loop()new_event_loop() 函式的行為可以透過設定自訂事件迴圈策略進行調整。

目錄

本頁文件包含以下章節:

事件迴圈方法

事件迴圈提供以下低階 API:

啟動和停止迴圈

loop.run_until_complete(future)

運行直到 future (一個 Future 實例)完成。

如果引數是協程物件,則它將被隱式排程為 asyncio.Task 運行。

回傳 Future 的結果或引發其例外。

loop.run_forever()

運行事件迴圈直到 stop() 被呼叫。

如果在呼叫 run_forever() 之前呼叫 stop(),則迴圈將使用超時為零的方式輪詢 I/O 選擇器,運行所有回應 I/O 事件(以及已經排程的事件)的回呼,然後退出。

如果在 run_forever() 運行時呼叫 stop(),則迴圈將運行目前批次的回呼函式,然後退出。請注意,由回呼函式排程的新回呼在此情況下不會運行;而是在下次呼叫 run_forever()run_until_complete() 時運行。

loop.stop()

停止事件迴圈。

loop.is_running()

如果事件迴圈目前正在運行,則回傳 True

loop.is_closed()

如果事件迴圈已關閉,則回傳 True