Pemrograman Asynchronous dan Multithreading, apa Bedanya?

baca 6 menit
Pemrograman Asynchronous dan Multithreading, apa Bedanya?

Kita sering kali bertemu dengan 2 istilah ini ketika ngoding, Asynchronous dan Multithreading. Pernah kepikiran apa maksudnya? Atau sekarang sedang bertanya tanya?

Keduanya merupakan bentuk dari concurrency. Yaitu metode penyelesaian masalah dengan urutan eksekusi yang tidak wajar, alias tidak sesuai dengan urutan aslinya. Walaupun begitu, hasilnya harus tetap sama dan konsisten.

Karena tujuannya sama, tidak jarang ada orang yang bingung apa perbedaan keduanya. Nah, pada kesempatan kali ini kita akan coba membahasnya sesederhana mungkin dengan beberapa perumpamaan agar lebih mudah masuk di kepala.

Sekilas tentang Concurrency

Karena baik asynchronous dan multithreading adalah bentuk yang berbeda dari concurrency, tidak ada salahnya jika kita bahas sedikit tentang istilah yang satu ini.

Concurrency merupakan beberapa proses komputasi yang dilakukan dalam waktu bersamaan. Tidak satu per satu dan tidak harus saling menunggu.

Sadar atau tidak, banyak sesuatu di sekitar kita yang tidak bisa lepas dari yang namanya concurrency ini. Mulai dari ponsel, komputer, hingga kegiatan sehari-hari kita.

Bisa kita bayangkan, tanpa concurrency kita tidak akan bisa ngoding sambil streaming lagu sambil download game sambil rendering video sambil telponan sambil kelas onlen sambil ngopi sambil tiduran sambil ... (isi sendiri).

Intinya, concurrency adalah semua tentang sambilsambil, sambil, sambil, sam..bil, sa..m..bi..l? entah kenapa kata sambil lama-lama jadi kedengaran aneh.

Kita coba contoh yang mungkin lebih teknikal. Bayangkan ada server tanpa concurrency. Ketika ada klien yang request data katakanlah 10 orang. Tiap data butuh waktu 1 detik untuk diproses. Dengan metode biasa — tanpa concurrency — kita harus meladeni permintaan itu satu per satu.

Dalam kasus ini, misal permintaan diladeni berdasarkan urutan datangnya. Sehingga pengguna pertama mendapat data dalam waktu 1 detik, pengguna ke-2 harus menunggu pengguna pertama selesai, belum lagi ditambah waktu prosesnya sehingga total waktu tunggunya 2 detik. Begitu seterusnya sampai pengguna ke 10 selama 10 detik.

Yang namanya server pasti didesain untuk meladeni banyak data kan ya. Mungkin ratusan, ribuan, bahkan jutaan per detik. Bayangkan jika tanpa concurrency, pengguna ke sekian bisa bosan menunggu, ditinggal ngopi sampai ketiduran juga belum tentu selesai.

Nah, dengan adanya concurrency kita bisa meladeni permintaan sebanyak apapun secara bersamaan — tentu selama komputer server kuat menanganinya.

Semoga sampai sini dapat gambaran lah ya.

Dalam prakteknya, concurrency bisa diimplementasikan dengan banyak metode. Salah dua-nya adalah pemrograman asinkron dan pemrograman multi thread yang akan kita bahas setelah ini.

Asynchronous Programming

Asynchronous programming atau Bahasa Indonesianya pemrograman asinkron merupakan teknik concurrency yang memungkinkan suatu perintah berjalan tanpa perlu menunggu perintah sebelumnya selesai terlebih dahulu.

Karena antar perintah tidak saling menunggu, komputer bisa melakukan hal lainnya. Hal ini memungkinkan banyak proses dieksekusi dalam satu waktu secara bersamaan. Ini disebut dengan non blocking execution.

Kebalikan dari pemrograman asinkron adalah pemrograman sinkron alias synchronous programming. Pada pemrograman jenis ini, setiap proses harus berjalan secara urut, satu per satu dari atas ke bawah.

Pada pemrograman sinkron, jika proses sebelumnya belum selesai di eksekusi, maka proses selanjutnya tidak akan bisa dieksekusi. Proses ini disebut dengan blocking execution.

Supaya lebih kebayang, kita coba ambil contoh ketika bikin mie instan + telor. Misal di sini telornya digoreng dulu ya.

Pada umumnya langkah yang akan dilakukan seperti ini:

  1. Rebus air pada panci
  2. Buka kemasan mie instan dan tuangkan semua bumbunya pada piring kosong
  3. Selagi menunggu air mendidih, goreng telur dengan minyak panas lalu tiriskan
  4. Selagi telur ditiriskan, masukkan mie ke dalam air yang sudah mendidih
  5. Tunggu hingga mie matang dan melembek
  6. Jika sudah matang, tiriskan air yang tersisa
  7. Masukkan mie yang sudah ditiriskan ke dalam piring yang sudah ada bumbu, lalu aduk sampai rata
  8. Taruh telur goreng yang sudah ditiriskan ke atas mi
  9. Mi goreng siap disantap.

Kurang lebih begitu lah ya..

Pada proses tersebut, sadar atau tidak kita sudah menggunakan konsep asynchronous — keren juga ya. Nah asinkronnya di mana kira-kira?

Pada kasus ini kita punya 2 tujuan yang harus selesai, yaitu menggoreng telur dan memasak mi. Pada masalah tersebut kita melakukan kegiatan lain selagi menunggu sesuatu. Seperti ketika merebus air sambil goreng telur dan meniriskan telur sambil mengaduk mi.

Inilah yang dimaksud asynchronous, melakukan sesuatu yang lain sembari menunggu kegiatan lainnya selesai.

Jika kita pakai metode synchronous akan beda cerita, dengan metode ini semua langkah harus dilakukan secara urut. Dengan kata lain, kita harus membuat mie sampai matang lengkap dengan bumbu sebelum menggoreng telur.

Hal ini tentu tidak efisien, karena banyak waktu yang akan terbuang hanya untuk menunggu air mendidih dan menunggu minyak tiris. Di samping itu, mie yang kita masak juga keburu dingin kalo harus ditinggal goreng telur — mana keburu laper duluan ya kan.

Yah, semoga dapat poinnya lah ya.

Bicara tentang implementasi, pemrograman asinkron sudah tidak bisa terpisah dari komputer yang kita pakai.

Coba perhatikan browser yang kalian pakai buat baca artikel ini. Sadar atau tidak, semua proses di balik layar terjadi secara asinkron. Bahkan, Javascript — bahasa de-facto untuk browser — secara penuh berjalan secara asynchronous dengan event loop-nya.

Buktinya? bisa kita lihat, ketika browser masih memuat laman, kita sudah bisa mengklik link yang ada. Jika asinkron tidak digunakan, maka kita tidak akan bisa melakukan apa-apa sampai laman web termuat. Bahkan mungkin pointer mouse tidak akan bisa berjalan.

Sepertinya cukup untuk asynchronous programming, sekarang kita beranjak ke multi-thread programming

Multi-thread Programming

Kalau asynchronous programming melakukan proses lain selagi menunggu proses sebelumnya, pada pemrograman multi thread kita akan melakukan beberapa proses secara bersamaan — benar-benar bersamaan.

Pemrograman multi-thread adalah ketika proses dijalankan secara bersamaan, secara paralel oleh beberapa worker yang berbeda.

Pasti pernah dengar kan, spek prosesor dengan dual core (2), quad core (4), octa core (8), atau bahkan lebih dari itu. Belum lagi dalam tiap core itu dibagi menjadi beberapa thread, umumnya 2.

Nah, setiap thread dalam CPU ini bisa kita ibaratkan sebagai 1 pekerja.

Pada pemrograman biasa alias single-threaded programming kita hanya memanfaatkan 1 thread yang ada. Namun, dengan pemrograman multi-thread kita bisa menggunakan beberapa thread sekaligus untuk melakukan sesuatu.

Karena ada lebih dari 1 pekerja, kita bisa melakukan pembagian tugas. Dengan begitu beberapa proses bisa dilakukan secara bersamaan sehingga lebih efisien.

Coba kita kembali ke kasus memasak mie instan + telor goreng.

Kalau dalam kasus asinkron di atas kita sendiri yang memasak mie dan menggoreng telur secara bersamaan, dengan multi thread kita akan minta bantuan ke teman untuk saling bagi tugas.

Bisa jadi kita yang memasak mie dan teman kita yang memasak telur atau mungkin sebaliknya.

Dalam pemrograman multi-thread, memiliki banyak pekerja bukan berarti semakin efisien. Bisa jadi lebih sedikit lebih baik. Bahkan mungkin single-thread saja sudah lebih dari cukup.

Efisiensi maksimal pada pemrograman multi thread akan terjadi ketika proses yang satu tidak secara signifikan tergantung pada proses lainnya. Dengan kata lain, setiap thread memiliki tujuan tersendiri dan saling independen.

Analoginya, kita balik lagi ke kasus bikin mie dan telor goreng.

Semisal kita memanggil 3 teman — jadi totalnya 4 bersama diri sendiri — untuk membantu kita. Dua orang memasak mie kita sebut tim mie, sedangkan dua orang lagi memasak telur kita sebut tim telur.

Misal dalam tiap tim diputuskan untuk bagi job desc lagi menjadi seperti ini:

  • Orang pertama dalam tim mie merebus air dan meniriskan air
  • Orang ke-2 dalam tim mie menaruh bumbu pada piring dan mencampur mie dengan bumbu
  • Orang pertama dalam tim telur memanaskan minyak dan memecah telur
  • Orang ke-2 dalam tim telur menggoreng telur dan meniriskan minyak

Dari sini saja sudah terlihat ya bagaimana ribetnya. Tiap orang punya banyak waktu menganggur selagi orang lainnya melakukan sesuatu. Hal ini tentu tidak efisien, apalagi yang dimasak cuma sebungkus mie goreng😢

Mungkin untuk kasus ini kita bisa sepakat satu orang sudah cukup.

Kesimpulan

Kalau kita tarik kesimpulan, perbedaan mendasar dari 2 metode ini ada pada pekerja dan cara kerjanya.

Pada pemrograman asinkron, satu orang dapat mengerjakan banyak pekerjaan sekaligus selagi menunggu sesuatu. Di sisi lain, pemrograman multi thread memanfaatkan banyak pekerja (thread) untuk melakukan banyak hal secara paralel dan bersamaan.

Banyak pekerjaCara kerja
AsynchronousSatuBeberapa pekerjaan sekaligus
Multi-threadBanyak (lebih dari 1)Berbagi tugas antar pekerja

Referensi