4 poin oleh GN⁺ 2024-03-26 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-03-26
Opini Hacker News
  • Async/await dan single-thread

    • Async/await pada single-thread seperti model JavaScript itu sederhana dan sudah dipahami dengan baik.
    • Dengan thread, beberapa CPU bisa menangani masalah, dan Rust membantu pengelolaan lock.
    • Kita bisa memiliki thread dengan prioritas berbeda, dan ini diperlukan jika ada batasan pada komputasi.
    • Async/await multi-thread itu kompleks. Pada bagian yang komputasinya dibatasi, modelnya bisa runtuh.
    • Komputasi multi-thread di Rust tidak bekerja dengan baik. Beberapa masalahnya:
      • Keruntuhan kemacetan futex: bisa menjadi masalah pada beberapa allocator penyimpanan.
      • Kelaparan akibat mutex yang tidak adil: Mutex standar dan channel crossbeam-channel bersifat tidak adil.
  • Async/await vs thread

    • Kritiknya bukan soal kompleksitas, melainkan soal ekosistem yang terpecah karena pilihan ini dan salah satunya menjadi inferior.
    • Ekosistem Rust memutuskan bahwa untuk melakukan pekerjaan I/O, semuanya harus memakai async/await.
    • Jika Rust membuat hal-hal selain async/await menjadi abstraksi yang lebih mudah dikombinasikan, keluhan ini mungkin akan hilang.
  • Masalah pada artikel

    • Hanya satu contoh web server yang diberikan, dan penyelesaiannya untuk thread keliru.
    • Para programmer menginginkan thread yang konseptual dan semantik, bukan OS thread.
    • OS thread mahal, dan kita menginginkan thread yang murah.
    • Ada masalah dalam implementasi timeout pada contoh web server.
  • Hal-hal yang tidak dibahas

    • Async/await berjalan pada single-thread sehingga tidak memerlukan lock atau sinkronisasi.
    • Propagasi error pada async/await tidak jelas.
    • Backpressure pada network I/O juga seharusnya disebutkan.
  • Poin penting tentang pembatalan

    • Pekerjaan apa pun di masa depan bisa dibatalkan dengan mudah.
    • Pembatalan pada thread itu rumit, dan penghentian paksa thread tidak andal.
    • Dalam model async Rust, timeout bisa ditambahkan dari luar ke semua future.
  • Kampanye yang terasa seperti marketing untuk async/await

    • Async/await adalah kesalahan teknis dan menimbulkan biaya besar bagi komunitas.
    • Rust tetap bahasa terbaik, tetapi ada kekhawatiran perdebatan ini akan berlangsung selamanya.
  • Async/await vs fiber

    • Rust sebelumnya pernah memiliki green thread dan sengaja menghapusnya.
    • Kemampuan untuk membuang future kapan saja membawa biaya besar.
    • Agak aneh memuji kemampuan kombinasi async/await.
  • Keunggulan utama async/await di Rust

    • Bisa tetap bekerja bahkan dalam situasi tanpa thread atau memori dinamis.
    • Memungkinkan penulisan kode yang ringkas dengan memanfaatkan konkurensi.
  • Kesalahpahaman tentang async/await

    • Ada orang-orang yang tidak memahami mengapa mekanisme konkurensi pada single-thread diperlukan.
    • Async/await berguna untuk pemrograman UI, komunikasi dengan GPU, dan komunikasi antarruntime.
  • Alasan memilih async/await dibanding thread

    • Async/await bisa mengurangi penggunaan memori untuk status klien/permintaan/pekerjaan.
    • Kompresi status penting untuk performa di era modern saat kecepatan memori lambat.
    • Async/await dan CPS efektif untuk mengurangi penggunaan memori per klien.