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ộtTaskmà ứ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ớpLoopphơ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.cancelvà 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ủaawait,__aiter__/__anext__choasync for, và__aenter__/__aexit__choasync with.Chụp khung hình -- wrapper biến
csi.CSI.snapshot()thành một coroutine thân thiện vớiawait, để 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 network và socket 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.