1. Sync vs Async: Perbedaan Mendasar
Dalam dunia IoT, perangkat sering kali perlu melakukan banyak hal bersamaan: membaca sensor, mengirim data ke server, menerima perintah dari MQTT, menyimpan ke database, dan memantau koneksi jaringan. Jika semua ini dilakukan secara sinkron (berurutan), sistem akan menjadi lambat dan tidak responsif.
Pemrograman asinkron memungkinkan program kita "menunggu" operasi yang lambat (jaringan, I/O) tanpa memblokir eksekusi keseluruhan. Saat satu operasi menunggu, operasi lain bisa berjalan.
SINKRON (Berurutan) ASINKRON (Bersamaan)
| Baca Sensor | | Baca Sensor |
| Kirim HTTP | | Kirim HTTP |
| Tunggu... | | Tunggu... |
| Terima Resp | | Baca Sensor 2 |
| Baca Sensor 2| | Terima Resp |
| Simpan DB | | Simpan DB |
| Tunggu... | | Tunggu... 8
| Terima Resp | | Terima Resp |
Total: ~8 detik Total: ~3 detik
Kapan Menggunakan Async?
| Kondisi | Rekomendasi |
|---|---|
| Banyak operasi I/O (HTTP, MQTT, database) | ✅ Gunakan async |
| Perlu handle banyak sensor secara bersamaan | ✅ Gunakan async |
| Server IoT perlu handle banyak client | ✅ Gunakan async |
| Operasi CPU-intensive (image processing, ML) | ⚠️ Gunakan multiprocessing |
| Program sederhana, satu tugas sekaligus | ❌ Cukup sinkron saja |
| Script one-shot (baca sekali, kirim, selesai) | ❌ Cukup sinkron saja |
Async bukan "lebih cepat" dari sinkron dalam hal kecepatan eksekusi per-baris kode. Keunggulannya adalah efisiensi waktu tunggu — saat satu operasi menunggu I/O, operasi lain bisa mulai. Ini sangat krusial di IoT di mana banyak sensor dan koneksi jaringan berjalan bersamaan.
2. Asyncio Basics
asyncio adalah library bawaan Python (sejak Python 3.4) yang menyediakan infrastruktur untuk menulis kode asinkron. Library ini menjadi fondasi dari ekosistem async Python — hampir semua library async modern (aiohttp, aiomqtt, aiosqlite) dibangun di atas asyncio.
2.1 — Konsep Dasar
| Konsep | Penjelasan |
|---|---|
async def | Mendefinisikan coroutine — fungsi yang bisa dijalankan secara asinkron |
await | Menunggu coroutine selesai tanpa memblokir event loop |
| Event Loop | Mesin eksekusi asyncio yang mengatur kapan tiap coroutine berjalan |
| Task | Coroutine yang sudah dijadwalkan di event loop |
asyncio.gather() | Menjalankan beberapa coroutine secara bersamaan |
asyncio.sleep() | Tidur asinkron — tidak memblokir event loop |