擴充套件¶
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.Future
和 asyncio.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()
執行後立即呼叫此函式。