โดยปกติ หาก Coroutine เริ่มทำงานโดยใช้ฟังก์ชัน asyncio.run(coroutine)
การขัดจังหวะด้วยแป้นพิมพ์ (CTRL + C) หรือ SIGINT จะยกเลิกงานที่ค้างอยู่ทั้งหมดในลูปเหตุการณ์ ฉันกำลังมองหาวิธีที่เฉพาะงานหลัก (งานที่ส่งผ่านไปยัง asyncio.run(coroutine)
) เท่านั้นที่จะถูกยกเลิก แนวคิดก็คืองานหลักจะจัดการยกเลิกงานย่อยทั้งหมดตามลำดับที่เห็นสมควร
ลองพิจารณาตัวอย่าง:
import asyncio
async def main():
foo_task = asyncio.create_task(foo())
try:
await asyncio.sleep(10)
print('main finished')
finally:
print('ensuring foo task is finished')
await foo_task
async def foo():
await asyncio.sleep(10)
print('foo finished')
try:
asyncio.run(main())
except KeyboardInterrupt:
pass
ฉันต้องการเปลี่ยนโค้ดด้านบนเพื่อที่ว่าหากมีการขัดจังหวะแป้นพิมพ์หรือ SIGINT ถูกส่งไประหว่างการดำเนินการ foo_task
จะยังคงเสร็จสิ้น ควรพิมพ์สิ่งต่อไปนี้:
ensuring foo task is finished
foo finished
ฉันไม่ต้องการใช้การป้องกัน (asyncio.shield(coroutine)
) เพราะฉันต้องการให้งานหลักควบคุมลำดับการยกเลิก/ดำเนินการงานย่อยได้อย่างสมบูรณ์