擴充套件¶
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()
之後立即呼叫此函式。