Biasanya, jika coroutine dimulai menggunakan fungsi asyncio.run(coroutine)
, interupsi keyboard (CTRL + C) atau SIGINT akan membatalkan semua tugas yang tertunda pada loop peristiwa. Saya mencari cara agar hanya tugas utama (yang diteruskan ke asyncio.run(coroutine)
) yang akan dibatalkan. Idenya adalah bahwa tugas utama kemudian akan mengatur pembatalan semua sub-tugas dalam urutan apa pun yang dianggap sesuai.
Perhatikan sebuah contoh:
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
Saya ingin mengubah kode di atas sehingga jika ada interupsi keyboard atau SIGINT yang dikirim di tengah eksekusi, foo_task
akan tetap selesai. Itu harus mencetak yang berikut ini:
ensuring foo task is finished
foo finished
Saya tidak ingin menggunakan pelindung (asyncio.shield(coroutine)
) karena saya ingin tugas utama memiliki kontrol penuh atas urutan pembatalan/eksekusi subtugasnya.