8.13. Kontrol loop

Sebagian besar skrip asyncio tidak pernah menyentuh event loop secara langsung -- asyncio.run() sudah cukup. Halaman ini mencakup permukaan Loop untuk kasus-kasus di mana itu tidak cukup: memasang handler pengecualian, menjalankan loop dengan siklus hidup yang berbeda dari run, atau menyimpan objek loop untuk instrumentasi.

8.13.1. Mendapatkan loop

  • asyncio.get_event_loop() -- mengembalikan objek Loop. Aman dipanggil dari dalam maupun luar coroutine.

  • asyncio.new_event_loop() -- pada MicroPython, mengatur ulang state loop yang ada daripada membuat yang baru. Catatan ini perlu diulang: hanya ada satu event loop per program.

Tidak ada API untuk menjalankan loop selain metode pada Loop dan asyncio.run().

8.13.2. Menjalankan loop secara langsung

asyncio.run() adalah titik masuk yang tepat untuk hampir setiap aplikasi. Dua metode Loop ada untuk kasus di mana itu tidak cukup.

  • run_until_complete() -- diberikan sebuah awaitable, jalankan loop hingga awaitable tersebut selesai, lalu kembalikan hasilnya. Setara dengan satu panggilan asyncio.run(), dengan pembongkaran loop dihilangkan.

  • run_forever() -- jalankan loop hingga stop() dipanggil dari dalam sebuah task. Tidak ada awaitable tingkat atas; aplikasi diharapkan menjadwalkan apa pun yang dibutuhkan melalui asyncio.create_task() sebelum memanggil run_forever.

Metode pendamping adalah stop() (minta loop berhenti setelah task saat ini selesai) dan close() (bebaskan sumber daya loop).

8.13.3. Pembuatan task sisi loop

  • create_task() -- operasi yang sama dengan asyncio.create_task(). Fungsi bebas ada agar kode aplikasi tidak memerlukan referensi loop untuk kasus umum; metode ada untuk instrumentasi yang sudah memilikinya.

8.13.4. Handler pengecualian

Loop memanggil sebuah handler ketika task memunculkan pengecualian yang tidak ditangkap oleh siapa pun dalam rantai panggilan coroutine -- kasus umum adalah task yang dibuat aplikasi dengan asyncio.create_task() dan tidak pernah di-await. Handler default mencetak traceback melalui sys.stderr; halaman pengecualian menunjukkan cara menggantinya dengan yang kustom.

  • set_exception_handler() -- pasang handler kustom. Handler adalah callable handler(loop, context) di mana context adalah dict dengan setidaknya 'message' dan biasanya 'exception' dan 'future'.

  • get_exception_handler() -- kembalikan handler yang saat ini terpasang, atau None jika yang default sedang digunakan.

  • default_exception_handler() -- handler bawaan. Berguna di dalam handler kustom yang ingin juga menjalankan perilaku default (catat ke flash dan cetak traceback, misalnya).

  • call_exception_handler() -- jalankan handler yang saat ini terpasang dengan dict konteks yang dibuat secara manual. Sebagian besar digunakan oleh loop itu sendiri; aplikasi jarang membutuhkannya.