- Di komunitas Rust, sering muncul pertanyaan: thread bisa melakukan semua yang bisa dilakukan
async/await dan bahkan lebih sederhana, jadi mengapa memilih async/await?
- Rust adalah bahasa tingkat rendah yang tidak menyembunyikan kompleksitas coroutine. Ini berlawanan dengan bahasa seperti Go, yang pada dasarnya menjadi asinkron secara default tanpa programmer perlu memikirkan asinkroni.
- Programmer yang cerdas berusaha menghindari kompleksitas, jadi mengapa
async/await diperlukan?
Mengenal latar belakang
- Rust adalah bahasa tingkat rendah. Kode umumnya bersifat linear, dan ketika satu tugas selesai, tugas lain dijalankan.
- Dalam kasus seperti web server yang harus menjalankan banyak tugas secara bersamaan, kode linear menimbulkan masalah.
- Web pada masa awal mencoba menyelesaikan masalah ini dengan memperkenalkan threading.
- Dengan menggunakan thread, beberapa klien dapat ditangani secara bersamaan, tetapi para programmer ingin membawa konkurensi dari ruang OS ke ruang pengguna.
Masalah timeout
- Salah satu keunggulan terbesar Rust adalah composability.
async/await memungkinkan composability ini diterapkan pada fungsi yang terikat I/O.
- Misalnya, saat ingin menambahkan timeout pada fungsi penanganan klien, hal itu dapat diimplementasikan dengan menggunakan dua combinator.
Thread tematik
- Dalam contoh yang menggunakan thread, mengimplementasikan timeout tidaklah mudah.
TcpStream memiliki fungsi set_read_timeout dan set_write_timeout, tetapi penggunaannya terbatas.
- Artikel ini menunjukkan cara memprogram timeout menggunakan combinator Rust, tetapi pendekatan itu terbatas hanya pada
TcpStream dan memerlukan system call tambahan.
Kisah sukses async
- Ekosistem HTTP mengadopsi
async/await sebagai mekanisme runtime utama.
tower adalah contoh yang menunjukkan kekuatan async/await, dengan menyediakan timeout, rate limiting, load balancing, dan lain-lain.
macroquad adalah game engine Rust yang menjalankan engine-nya menggunakan async/await.
Memperbaiki citra async
- Karena manfaat
async belum dikenal luas, sebagian orang bisa salah memahaminya.
- Komunitas Rust cenderung melebih-lebihkan keuntungan performa dari
async Rust dan mengecilkan manfaat yang benar-benar bermakna.
async/await harus dipandang sebagai model pemrograman yang kuat yang dapat mengekspresikan secara ringkas pola-pola yang dalam Rust sinkron tidak dapat dinyatakan tanpa puluhan thread dan channel.
Opini GN⁺
async/await memang meningkatkan kompleksitas kode saat menangani konkurensi, tetapi sekaligus memberikan kemampuan untuk menangani banyak klien secara efisien.
- Artikel ini menekankan bahwa
async/await memiliki kekuatan sebagai model pemrograman, bukan sekadar keuntungan performa.
async/await di Rust memberikan composability untuk berbagai tugas I/O, yang sangat berguna khususnya di bidang seperti layanan jaringan atau web server.
- Dari sudut pandang kritis, kompleksitas
async/await bisa menjadi hambatan masuk bagi developer pemula, sehingga diperlukan upaya edukasi untuk mengatasinya.
- Proyek lain yang menyediakan fungsi serupa mencakup implementasi
async/await di Node.js atau library asyncio di Python, yang juga menawarkan paradigma serupa.
- Saat mengadopsi
async/await, kompleksitas kode dan maintainability perlu dipertimbangkan, tetapi jika harus menangani banyak klien secara bersamaan, model ini memberikan keuntungan besar.
1 komentar
Opini Hacker News
Async/await dan single-thread
crossbeam-channelbersifat tidak adil.Async/await vs thread
Masalah pada artikel
Hal-hal yang tidak dibahas
Poin penting tentang pembatalan
Kampanye yang terasa seperti marketing untuk async/await
Async/await vs fiber
Keunggulan utama async/await di Rust
Kesalahpahaman tentang async/await
Alasan memilih async/await dibanding thread