事件迴圈¶
原始碼: Lib/asyncio/events.py、Lib/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.call_soon()和loop.call_later())回傳的Handle和TimerHandle實例;Server 物件章節記錄了從事件迴圈方法(如
loop.create_server())回傳的資料型別;事件迴圈實作章節記錄了
SelectorEventLoop和ProactorEventLoop類別;範例章節展示了如何使用一些事件迴圈 API。
事件迴圈方法¶
事件迴圈提供以下低階 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。