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 ของ loopSynchronisation primitives --
Eventสำหรับการส่งสัญญาณระหว่าง coroutine,Lockสำหรับ serialize การเข้าถึงทรัพยากรที่ใช้ร่วมกันข้ามการ await, และThreadSafeFlagสำหรับการปลุกงาน asyncio จาก interrupt handlerCustom async objects -- hooks ของภาษาที่ให้คลาสแอปพลิเคชัน plug เข้ากับ asyncio idioms
__await__สำหรับ object ที่เป็นตัวเอง target ของawait,__aiter__/__anext__สำหรับasync for, และ__aenter__/__aexit__สำหรับasync withFrame 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 ใช้ได้โดยตรง