8.16. Tổng kết

Bạn đã đi qua API của asyncio -- các phần mà một tập lệnh cần để chạy nhiều công việc đồng thời trên một CPU đơn:

  • Lập lịch hợp tác -- mô hình mà phần còn lại của module dựa vào. Coroutine đang chạy có loop cho riêng mình cho đến khi nó await; các lần chuyển đổi chỉ xảy ra tại những await đó.

  • Coroutine và task -- async def định nghĩa một đơn vị công việc; asyncio.create_task() lên lịch chạy một cái đồng thời và trả về một Task mà ứng dụng có thể chờ sau, huỷ bỏ, hoặc nhận dạng.

  • Event loop -- engine chạy coroutine và task. asyncio.run() là điểm vào duy nhất mà hầu hết các tập lệnh cần; lớp Loop phơi bày phần còn lại cho các trường hợp hiếm gặp cần nó.

  • Điều phối -- gather() để fan-out và fan-in, wait_for() để đặt deadline, Task.cancel và mẫu dọn dẹp mệnh đề finally, truyền ngoại lệ qua các task và lời gọi gather, và hook trình xử lý ngoại lệ của loop.

  • Nguyên thủy đồng bộ hoá -- Event để báo hiệu giữa các coroutine, Lock để tuần tự hoá truy cập vào tài nguyên chia sẻ qua các await, và ThreadSafeFlag để đánh thức một asyncio task từ trình xử lý ngắt.

  • Đối tượng async tuỳ chỉnh -- các hook ngôn ngữ cho phép các lớp ứng dụng tích hợp vào các idiom asyncio. __await__ cho các đối tượng là chính mục tiêu của await, __aiter__ / __anext__ cho async for, và __aenter__ / __aexit__ cho async with.

  • Chụp khung hình -- wrapper biến csi.CSI.snapshot() thành một coroutine thân thiện với await, để vòng lặp capture chạy cùng với các công việc asyncio khác.

  • Những bẫy thường gặp -- awaitbị quên, vòng lặp chặt chẽ không có yield, huỷ bỏ bị nuốt, trạng thái chia sẻ bị thay đổi qua các await, và phần còn lại của các bẫy đặc trưng của asyncio.

Điều đó đủ để viết các chương trình kết hợp công việc camera, I/O phần cứng, và công việc nền đồng thời trên cùng một loop.

8.16.1. Sử dụng tài liệu tham khảo này sau

Hãy coi các chương asyncio như tài liệu tham khảo; quay lại để tìm dạng của async with hoặc hành vi chính xác của gather() khi có lỗi ở sibling là cách dùng dự kiến. Trang tham chiếu asyncio liệt kê tất cả hàm và lớp trong một nơi khi câu hỏi chỉ là "tên chính xác của lời gọi này là gì".

Để có các nguyên thủy phong phú hơn được xây dựng trên module -- semaphore, queue, barrier, và một bộ sưu tập đáng kể các helper theo dạng ứng dụng -- kho peterhinch/micropython-async là nguồn cộng đồng được duy trì tiêu chuẩn.

8.16.2. Đi về đâu tiếp theo

Mạng là chủ đề lớn tiếp theo. asyncio.open_connection(), asyncio.start_server(), và lớp Stream là cách một tập lệnh asyncio nói chuyện với phần còn lại của mạng từ bên trong một coroutine, cùng với các module networksocket bên dưới. Mọi thứ bạn đã học về await, Task, huỷ bỏ, và các nguyên thủy đồng bộ hoá đều áp dụng thẳng tiếp.