擴充套件

asyncio 擴充套件的主要方向是編寫自定義的 事件迴圈 類。Asyncio 提供了簡化此任務的輔助函式。

備註

第三方應謹慎重用現有 asyncio 程式碼,新的 Python 版本可能會在 API 的 內部 部分破壞向後相容性。

編寫自定義事件迴圈

asyncio.AbstractEventLoop 聲明瞭許多方法。從頭開始實現所有這些方法是一項繁瑣的工作。

透過繼承 asyncio.BaseEventLoop,迴圈可以免費獲得許多常見方法的實現。

反過來,繼承者應該實現 asyncio.BaseEventLoop 中宣告但未實現的許多 私有 方法。

例如,loop.create_connection() 檢查引數,解析 DNS 地址,並呼叫 loop._make_socket_transport(),後者應由繼承類實現。_make_socket_transport() 方法未在文件中說明,被視為 內部 API。

Future 和 Task 私有建構函式

asyncio.Futureasyncio.Task 不應直接建立,請使用相應的 loop.create_future()loop.create_task(),或 asyncio.create_task() 工廠函式。

但是,為了免費獲得複雜且高度最佳化的程式碼,第三方 事件迴圈 可以 重用 內建的 future 和 task 實現。

為此,列出了以下 私有 建構函式

Future.__init__(*, loop=None)

建立一個內建的 future 例項。

loop 是一個可選的事件迴圈例項。

Task.__init__(coro, *, loop=None, name=None, context=None)

建立一個內建的 task 例項。

loop 是一個可選的事件迴圈例項。其餘引數請參閱 loop.create_task() 的描述。

3.11 版本發生變化: 添加了 context 引數。

Task 生命週期支援

第三方 task 實現應呼叫以下函式以使 task 對 asyncio.all_tasks()asyncio.current_task() 可見。

asyncio._register_task(task)

將新 task 註冊為由 asyncio 管理。

從 task 建構函式中呼叫此函式。

asyncio._unregister_task(task)

asyncio 內部結構中登出 task

此函式應在 task 即將完成時呼叫。

asyncio._enter_task(loop, task)

將當前 task 切換到 task 引數。

在執行嵌入式 協程 的一部分(coroutine.send()coroutine.throw())之前呼叫此函式。

asyncio._leave_task(loop, task)

將當前 task 從 task 切換回 None

在執行 coroutine.send()coroutine.throw() 之後立即呼叫此函式。