8.13. การควบคุม loop

สคริปต์ asyncio ส่วนใหญ่ไม่เคยแตะ event loop โดยตรง -- asyncio.run() เพียงพอ หน้านี้ครอบคลุม surface ของ Loop สำหรับกรณีที่มันไม่เพียงพอ: การติดตั้ง exception handler การรัน loop ด้วย lifecycle ที่แตกต่างจาก run หรือการเก็บอ็อบเจกต์ loop ไว้สำหรับการตรวจวัด

8.13.1. การรับ loop

  • asyncio.get_event_loop() -- คืนอ็อบเจกต์ Loop ปลอดภัยที่จะเรียกจากภายในหรือภายนอก coroutine

  • asyncio.new_event_loop() -- บน MicroPython รีเซ็ตสถานะของ loop ที่มีอยู่ แทนที่จะสร้างอันใหม่ หมายเหตุนี้ควรจำ: มี event loop เพียงหนึ่งเดียวต่อโปรแกรม

ไม่มี API สำหรับ รัน loop นอกจาก method บน Loop และ asyncio.run()

8.13.2. การรัน loop โดยตรง

asyncio.run() คือจุดเข้าที่ถูกต้องสำหรับเกือบทุกแอปพลิเคชัน มี method ของ Loop สองอันสำหรับกรณีที่มันไม่ใช่

  • run_until_complete() -- ให้ awaitable รัน loop จนกว่า awaitable จะเสร็จสิ้น แล้วคืนผลลัพธ์ เทียบเท่ากับการเรียก asyncio.run() ครั้งเดียว โดยไม่มีการทำลาย loop

  • run_forever() -- รัน loop จนกว่า stop() จะถูกเรียกจากภายใน task ไม่มี awaitable ระดับบนสุด แอปพลิเคชันคาดว่าจะกำหนดเวลาสิ่งที่ต้องการผ่าน asyncio.create_task() ก่อนเรียก run_forever

method ที่เป็นคู่คือ stop() (ขอให้ loop หยุดหลังจาก task ปัจจุบันเสร็จ) และ close() (คืนทรัพยากรของ loop)

8.13.3. การสร้าง task ฝั่ง loop

  • create_task() -- การดำเนินการเดียวกับ asyncio.create_task() ฟังก์ชันอิสระมีอยู่เพื่อให้โค้ดแอปพลิเคชันไม่ต้องการ loop reference สำหรับกรณีทั่วไป method มีอยู่สำหรับการตรวจวัดที่มี loop reference อยู่แล้ว

8.13.4. Exception handlers

loop จะเรียก handler เมื่อ task ยกข้อยกเว้นที่ไม่มีสิ่งใดใน coroutine call chain จับ -- กรณีทั่วไปคือ task ที่แอปพลิเคชันสร้างด้วย asyncio.create_task() และไม่เคย await handler เริ่มต้นจะพิมพ์ traceback ผ่าน sys.stderr หน้า exceptions แสดงวิธีแทนที่ด้วยอะไรที่กำหนดเอง

  • set_exception_handler() -- ติดตั้ง handler แบบกำหนดเอง handler คือ callable handler(loop, context) ที่ context เป็น dict ที่มีอย่างน้อย 'message' และมักมี 'exception' และ 'future'

  • get_exception_handler() -- คืน handler ที่ติดตั้งอยู่ปัจจุบัน หรือ None หากใช้ handler เริ่มต้น

  • default_exception_handler() -- handler ในตัว มีประโยชน์ภายใน handler แบบกำหนดเองที่ต้องการ รัน พฤติกรรมเริ่มต้นด้วย (บันทึกไปยัง flash และ พิมพ์ traceback เป็นต้น)

  • call_exception_handler() -- รัน handler ที่ติดตั้งอยู่ปัจจุบันด้วย context dict ที่สร้างด้วยตนเอง ส่วนใหญ่ใช้โดย loop เอง แอปพลิเคชันแทบไม่ต้องการมัน