擴充套件

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() 執行後立即呼叫此函式。