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.