asyncio --- bộ lập lịch I/O bất đồng bộ¶
Mô-đun này cung cấp bộ lập lịch đa nhiệm hợp tác cho các coroutine async/await, cùng với các nguyên thủy để đồng bộ hóa (khóa, sự kiện) và kết nối TCP không chặn qua các luồng đọc và ghi. Các tác vụ chạy đồng thời trên một vòng lặp sự kiện duy nhất; tác vụ đang chạy nhường quyền điều khiển trở lại vòng lặp bằng await.
Ví dụ:
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)))
Các hàm cốt lõi¶
- asyncio.create_task(coro: Coroutine) Task¶
Tạo một tác vụ mới từ coroutine đã cho và lên lịch để chạy nó.
Trả về đối tượng
Tasktương ứng.
- asyncio.run(coro: Coroutine) Any¶
Tạo một tác vụ mới từ coroutine đã cho và chạy nó cho đến khi hoàn thành.
Trả về giá trị được trả về bởi coro.
Các hàm bổ sung¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
Chờ awaitable hoàn thành, nhưng hủy nó nếu mất hơn timeout giây. Nếu awaitable không phải là tác vụ thì một tác vụ sẽ được tạo từ nó.
Nếu hết thời gian chờ, nó hủy tác vụ và ném
asyncio.TimeoutError: ngoại lệ này phải được bắt bởi hàm gọi. Tác vụ nhận đượcasyncio.CancelledError, có thể bỏ qua hoặc bắt bằngtry...excepthoặctry...finallyđể chạy mã dọn dẹp.Trả về giá trị trả về của awaitable.
Đây là một coroutine.
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
Tương tự
wait_for()nhưng timeout là số nguyên tính bằng mili giây.Đây là một coroutine, và là phần mở rộng của MicroPython.
class Task¶
- class asyncio.Task¶
Đối tượng này bọc một coroutine vào một tác vụ đang chạy. Các tác vụ có thể được chờ bằng
await task, điều này sẽ chờ tác vụ hoàn thành và trả về giá trị trả về của tác vụ.Không nên tạo tác vụ trực tiếp, thay vào đó hãy sử dụng
create_task()để tạo chúng.
class Event¶
- class asyncio.Event¶
Tạo một sự kiện mới có thể được dùng để đồng bộ hóa các tác vụ. Các sự kiện bắt đầu ở trạng thái đã xóa.
- set() None¶
Thiết lập sự kiện. Bất kỳ tác vụ nào đang chờ sự kiện sẽ được lên lịch để chạy.
Lưu ý: Hàm này phải được gọi từ bên trong một tác vụ. Không an toàn khi gọi từ IRQ, hàm gọi lại của bộ lập lịch, hay luồng khác. Xem
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Tạo một cờ mới có thể được dùng để đồng bộ hóa một tác vụ với mã chạy bên ngoài vòng lặp asyncio, chẳng hạn như các luồng khác, IRQ, hoặc hàm gọi lại của bộ lập lịch. Các cờ bắt đầu ở trạng thái đã xóa.
class Lock¶
- class asyncio.Lock¶
Tạo một khóa mới có thể được dùng để phối hợp các tác vụ. Các khóa bắt đầu ở trạng thái mở khóa.
Ngoài các phương thức bên dưới, các khóa có thể được sử dụng trong câu lệnh
async with.
Kết nối luồng TCP¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
Mở kết nối TCP tới host và port đã cho. Địa chỉ host sẽ được phân giải bằng
socket.getaddrinfo(), hiện tại là một lệnh gọi chặn. Nếu ssl là đối tượngssl.SSLContext, ngữ cảnh này được dùng để tạo transport; nếu ssl làTrue, một ngữ cảnh mặc định được sử dụng.Trả về một cặp luồng: luồng đọc và luồng ghi. Sẽ ném
OSErrorcụ thể theo socket nếu không thể phân giải host hoặc không thể thực hiện kết nối.Đây là một coroutine.
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
Khởi động máy chủ TCP trên host và port đã cho. callback sẽ được gọi với các kết nối đến được chấp nhận, và được truyền 2 đối số: luồng đọc và ghi cho kết nối.
Nếu ssl là đối tượng
ssl.SSLContext, ngữ cảnh này được dùng để tạo transport.Trả về đối tượng
Server.Đây là một coroutine.
- class asyncio.Stream¶
Đây đại diện cho một kết nối luồng TCP. Để tối giản mã, lớp này triển khai cả đọc và ghi, và cả
StreamReaderlẫnStreamWriterđều là bí danh cho lớp này.- get_extra_info(v: str) Any¶
Lấy thêm thông tin về luồng, được cho bởi v. Các giá trị hợp lệ cho v là:
peername.
- read(n: int = -1) bytes¶
Đọc tối đa n byte và trả về chúng. Nếu n không được cung cấp hoặc là -1 thì đọc tất cả byte cho đến EOF. Giá trị trả về sẽ là đối tượng bytes rỗng nếu gặp EOF trước khi đọc được byte nào.
Đây là một coroutine.
- readinto(buf: bytearray | memoryview) int¶
Đọc tối đa n byte vào buf với n bằng độ dài của buf.
Trả về số byte đã đọc vào buf.
Đây là một coroutine, và là phần mở rộng của MicroPython.
- readexactly(n: int) bytes¶
Đọc chính xác n byte và trả về chúng dưới dạng đối tượng bytes.
Ném ngoại lệ
EOFErrornếu luồng kết thúc trước khi đọc đủ n byte.Đây là một coroutine.
- write(buf: bytes) None¶
Tích lũy buf vào bộ đệm đầu ra. Dữ liệu chỉ được xả khi
Stream.drain()được gọi. Khuyến nghị gọiStream.drain()ngay sau khi gọi hàm này.
Vòng lặp sự kiện¶
- asyncio.get_event_loop() Loop¶
Trả về vòng lặp sự kiện được dùng để lên lịch và chạy các tác vụ. Xem
Loop.
- asyncio.new_event_loop() Loop¶
Đặt lại vòng lặp sự kiện và trả về nó.
Lưu ý: vì MicroPython chỉ có một vòng lặp sự kiện duy nhất, hàm này chỉ đặt lại trạng thái của vòng lặp, không tạo mới.
- class asyncio.Loop¶
Đây đại diện cho đối tượng lên lịch và chạy các tác vụ. Không thể tạo trực tiếp, hãy sử dụng
get_event_loop()thay thế.- run_until_complete(awaitable: Awaitable) Any¶
Chạy awaitable đã cho cho đến khi hoàn thành. Nếu awaitable không phải là tác vụ thì nó sẽ được nâng cấp thành một tác vụ.
- set_exception_handler(handler: Callable) None¶
Đặt trình xử lý ngoại lệ để gọi khi một Task ném ngoại lệ không được bắt. handler phải chấp nhận hai đối số:
(loop, context).