8.16. สรุป

คุณได้ศึกษา API ของ asyncio -- ส่วนต่างๆ ที่สคริปต์ต้องการเพื่อรันงานหลายอย่างพร้อมกันบน CPU เดียว:

  • Cooperative scheduling -- โมเดลที่ส่วนอื่นของโมดูลอิงอยู่ coroutine ที่กำลังทำงานมี loop เป็นของตัวเองจนกว่าจะ await; การสลับเกิดขึ้นที่จุด await เหล่านั้นเท่านั้น

  • Coroutines และ tasks -- async def กำหนดหน่วยงาน; asyncio.create_task() กำหนดให้ทำงานพร้อมกันและคืนค่า Task ที่แอปพลิเคชันสามารถรอ, ยกเลิก, หรือระบุได้ในภายหลัง

  • Event loop -- เครื่องยนต์ที่รัน coroutine และ task asyncio.run() คือ entry point เดียวที่สคริปต์ส่วนใหญ่ต้องการ; คลาส Loop เปิดเผยส่วนที่เหลือสำหรับกรณีที่หายากที่ต้องการมัน

  • Coordination -- gather() สำหรับ fan-out และ fan-in, wait_for() สำหรับ deadline, Task.cancel และรูปแบบการทำความสะอาดด้วย finally, การแพร่กระจาย exception ผ่าน task และการเรียก gather, และ hook exception handler ของ loop

  • Synchronisation primitives -- Event สำหรับการส่งสัญญาณระหว่าง coroutine, Lock สำหรับ serialize การเข้าถึงทรัพยากรที่ใช้ร่วมกันข้ามการ await, และ ThreadSafeFlag สำหรับการปลุกงาน asyncio จาก interrupt handler

  • Custom async objects -- hooks ของภาษาที่ให้คลาสแอปพลิเคชัน plug เข้ากับ asyncio idioms __await__ สำหรับ object ที่เป็นตัวเอง target ของ await, __aiter__ / __anext__ สำหรับ async for, และ __aenter__ / __aexit__ สำหรับ async with

  • Frame capture -- wrapper ที่เปลี่ยน csi.CSI.snapshot() ให้เป็น coroutine ที่ใช้ await ได้ เพื่อให้ capture loop ทำงานควบคู่กับงาน asyncio อื่นๆ

  • Pitfalls -- await ที่ถูกลืม, ลูปแน่นโดยไม่มีการ yield, การ cancellation ที่ถูกกลืน, สถานะที่ใช้ร่วมกันที่เปลี่ยนแปลงข้ามการ await, และกับดักเฉพาะของ asyncio อื่นๆ

นั่นเพียงพอสำหรับการเขียนโปรแกรมที่ผสมผสานงานกล้อง, ฮาร์ดแวร์ I/O, และงานพื้นหลังแบบ concurrent บน loop เดียวกัน

8.16.1. การใช้เอกสารอ้างอิงนี้ในภายหลัง

ให้ถือว่าบท asyncio เป็นเอกสารอ้างอิง; การกลับมาดูรูปแบบของ async with หรือพฤติกรรมที่แน่นอนของ gather() เมื่อ sibling ล้มเหลวคือการใช้งานที่ตั้งใจไว้ หน้าอ้างอิง asyncio รวบรวมทุกฟังก์ชันและคลาสไว้ในที่เดียวเมื่อคำถามคือแค่ "ชื่อที่แน่นอนของการเรียกนี้คืออะไร"

สำหรับ primitive ที่สมบูรณ์กว่าที่สร้างบนโมดูล -- semaphores, queues, barriers, และคอลเล็กชันของ helper ที่มีรูปแบบของแอปพลิเคชัน -- repository peterhinch/micropython-async คือแหล่งที่ชุมชนดูแลมาตรฐาน

8.16.2. จะไปที่ไหนจากที่นี่

Networking คือหัวข้อหลักถัดไป asyncio.open_connection(), asyncio.start_server(), และคลาส Stream คือวิธีที่สคริปต์ asyncio คุยกับเครือข่ายส่วนที่เหลือจากภายใน coroutine ร่วมกับโมดูล network และ socket ที่อยู่ข้างใต้ ทุกสิ่งที่คุณเรียนรู้เกี่ยวกับ await, Task, cancellation, และ synchronisation primitives ใช้ได้โดยตรง