- Asyncio adalah cara yang baik untuk menangani program yang terikat I/O di Python, dan pada dasarnya menyediakan lapisan yang baik di atas Python Generator
- Generator membuat kode lebih efisien dalam penggunaan memori, dan dengan keyword
yield, fungsi dapat dijeda lalu dilanjutkan kembali
- Dengan
yield from, generator dapat memanggil sub-generator atau objek iterable sehingga dapat membentuk rantai generator
Event loop
- Inti dari asyncio adalah event loop yang menjalankan dan mengelola task saat ini
- Event loop mengiterasi daftar task dan menjalankan tiap task dengan
next(task)
- Saat melakukan operasi I/O, task menjeda eksekusinya dengan
yield dan menyerahkan kendali ke event loop
Sleeping
- Dengan
yield from, kita dapat menambahkan sub-generator ke dalam task
- Dengan menambahkan generator sleep, eksekusi task dapat dijeda hingga waktu yang ditentukan
- Ketika sleep keluar dari loop
while, exception StopIteration terjadi sehingga yield from di fungsi task melanjutkan ke baris kode berikutnya
Dari Yield ke Await
- Dengan dunder method
__await__ dan keyword async, kita dapat beralih dari yield ke await
- Keyword
await dapat memanggil method __await__ milik instance kelas atau digunakan pada coroutine (objek yang dibuat oleh fungsi async)
- Keyword
await dapat dianggap sebagai sinonim dari yield from, dengan beberapa aturan validasi tambahan
- Kita dapat membuat class
Task sendiri, mengimplementasikan method __await__, lalu menambahkan task yang dibuat dengan fungsi create_task ke event loop
- Pengelola event loop menjalankan task, dan saat exception
StopIteration terjadi, task ditandai sebagai selesai
- Fungsi sleep juga perlu dimodifikasi agar kompatibel dengan async
AsyncIO dan Await
- Jika pada kode di atas "jacobio" diganti menjadi "asyncio", maka kita akan sepenuhnya menggunakan paket asyncio
- Asyncio melakukan lebih banyak hal, tetapi bagian intinya dapat direproduksi dari nol menggunakan generator dasar
- Dalam paket asyncio yang sebenarnya, kita dapat menggunakan fungsi seperti
asyncio.gather() untuk menangani banyak task
Pendapat GN⁺
- Artikel ini menjelaskan cara kerja asyncio dengan mudah menggunakan generator, sehingga tampaknya akan sangat membantu bagi developer yang baru pertama kali mengenal asyncio
- Asyncio adalah library yang dioptimalkan untuk pemrosesan I/O berperforma tinggi, dan dengan memahami struktur internalnya lewat artikel ini, kita bisa memanfaatkannya lebih efektif dalam proyek nyata
- Namun, asyncio yang sebenarnya memiliki struktur yang jauh lebih kompleks, sehingga untuk penggunaan di dunia kerja tampaknya tetap diperlukan pembelajaran yang lebih mendalam melalui dokumentasi resmi dan sumber lain
- Library lain yang menyediakan fungsi serupa dengan asyncio antara lain Trio dan Curio, dan membandingkan perbedaannya juga tampaknya akan menarik
- Saat mengadopsi asyncio, ada banyak hal yang perlu dipertimbangkan seperti kompatibilitas dengan kode sinkron yang sudah ada, penanganan error, dan pengujian, sehingga diperlukan peninjauan dan persiapan yang memadai
Belum ada komentar.