asyncio --- 非同步 I/O 排程器¶
本模組提供一個用於 async/await 協程的協作式多工排程器,並提供用於同步處理的基本元件(鎖、事件),以及透過串流讀取器與寫入器進行的非阻塞 TCP 網路功能。各項任務在單一事件迴圈上並行執行;目前執行中的任務透過 await 將控制權交還給迴圈。
範例::
import asyncio
async def blink(led, period_ms):
while True:
led.on()
await asyncio.sleep_ms(5)
led.off()
await asyncio.sleep_ms(period_ms)
async def main(led1, led2):
asyncio.create_task(blink(led1, 700))
asyncio.create_task(blink(led2, 400))
await asyncio.sleep_ms(10_000)
# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))
核心函式¶
- asyncio.run(coro: Coroutine) Any¶
從給定的協程建立一個新任務並執行它直到完成。
傳回 coro 所傳回的值。
其他函式¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
等待 awaitable 完成,但若耗時超過 timeout 秒則取消它。若 awaitable 不是任務,則會由它建立一個任務。
若發生逾時,則會取消該任務並引發
asyncio.TimeoutError:呼叫端應攔截此例外。該任務會收到asyncio.CancelledError,可以忽略它,或使用try...except或try...finally加以攔截以執行清理程式碼。傳回 awaitable 的回傳值。
這是一個協程。
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
與
wait_for()類似,但 timeout 是以毫秒為單位的整數。這是一個協程,也是 MicroPython 的擴充功能。
class Task¶
- class asyncio.Task¶
此物件將協程包裝成一個執行中的任務。可使用
await task等待任務,這會等待任務完成並傳回該任務的回傳值。不應直接建立任務,而應使用
create_task()來建立它們。
class Event¶
class ThreadSafeFlag¶
class Lock¶
TCP 串流連線¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
開啟一個到給定 host 與 port 的 TCP 連線。host 位址將使用
socket.getaddrinfo()解析,目前這是一個阻塞呼叫。若 ssl 是一個ssl.SSLContext物件,則會使用此情境來建立傳輸;若 ssl 為True,則使用預設情境。傳回一對串流:一個讀取器串流與一個寫入器串流。若無法解析主機或無法建立連線,將引發特定於通訊端的
OSError。這是一個協程。
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
在給定的 host 與 port 上啟動一個 TCP 伺服器。當有傳入並已接受的連線時,會呼叫 callback,並傳入 2 個引數:該連線的讀取器與寫入器串流。
若 ssl 是一個
ssl.SSLContext物件,則會使用此情境來建立傳輸。傳回一個
Server物件。這是一個協程。
- class asyncio.Stream¶
此類別代表一個 TCP 串流連線。為了將程式碼最小化,此類別同時實作了讀取器與寫入器,且
StreamReader與StreamWriter皆為此類別的別名。- read(n: int = -1) bytes¶
讀取至多 n 個位元組並傳回它們。若未提供 n 或其值為 -1,則讀取所有位元組直到 EOF。若在讀取任何位元組前即遇到 EOF,則傳回值將是一個空的 bytes 物件。
這是一個協程。
- readinto(buf: bytearray | memoryview) int¶
讀取至多 n 個位元組到 buf 中,n 等於 buf 的長度。
傳回讀取到 buf 中的位元組數。
這是一個協程,也是 MicroPython 的擴充功能。
- write(buf: bytes) None¶
將 buf 累積到輸出緩衝區。資料僅在呼叫
Stream.drain()時才會刷新。建議在呼叫此函式後立即呼叫Stream.drain()。
事件迴圈¶
- class asyncio.Loop¶
此類別代表負責排程與執行任務的物件。它無法被建立,請改用
get_event_loop()。- run_until_complete(awaitable: Awaitable) Any¶
執行給定的 awaitable 直到它完成。若 awaitable 不是任務,則它會被提升為任務。