Skip to content

Memahami Concurrency dan Efeknya pada Performa Apps

Concurrency adalah kemampuan sebuah program untuk menangani beberapa tugas (tasks) secara bersamaan dalam periode waktu yang sama. Penting untuk dipahami bahwa concurrency berkaitan dengan struktur program (bagaimana kode dirancang agar tugas bisa diselingi), bukan hanya tentang eksekusi fisik di hardware.

Analogi sederhana concurrency adalah seperti seorang koki yang bekerja di dapur. Jika koki tersebut mengikuti alur kerja sekuensial (tanpa concurrency), dia akan melakukan pekerjaannya secara berurutan: merebus air, berdiri diam menunggu air mendidih selama 10 menit, baru kemudian mulai memotong sayur. Sebaliknya, jika ia mengikuti alur kerja concurrency, dia akan melakukan pekerjaannya dengan lebih dinamis: dia menaruh panci air di atas kompor, lalu sambil menunggu air mendidih, ia memotong sayur. Koki tersebut bergerak bolak-balik menangani kedua tugas tersebut. Hanya ada satu koki (1 core CPU), tetapi dua pekerjaan selesai lebih cepat karena tidak ada waktu yang terbuang percuma hanya untuk menunggu satu pekerjaan selesai sebelum memulai yang lain.

Concurrency vs. Parallelism

Orang sering menganggap kedua konsep ini sama, padahal berbeda:

 ConcurrencyParallelism
DefinisiMenangani banyak tugas sekaligus (dealing with lots of things at once).Mengeksekusi banyak tugas sekaligus (doing lots of things at once).
Kebutuhan HardwareBisa berjalan pada 1 Core CPU (dengan berganti-ganti tugas secara cepat/context switching).Membutuhkan Multi-core CPU agar tugas benar-benar berjalan di detik yang persis sama.
Fokus UtamaEfisiensi dan struktur penanganan I/O-bound tasks (misal: menunggu query database, HTTP request, baca file).Kecepatan pemrosesan CPU-bound tasks (misal: render video, pengolahan matriks, machine learning).

Setiap bahasa pemrograman menggunakan pendekatan yang berbeda untuk menangani concurrency:

  1. Threads & Locks (Java, C++, C#)
    • Menggunakan thread dari Sistem Operasi.
    • Kelebihan: Sangat powerful untuk memanfaatkan kemampuan CPU multi-core.
    • Tantangan: Rentan terhadap masalah seperti Race Condition (beberapa thread mengubah data sama di waktu bersamaan) dan Deadlock.
  2. Async / Await & Event Loop (JavaScript/Node.js, Python, C#)
    • Berjalan pada single thread menggunakan mekanisme non-blocking I/O.
    • Ketika ada proses berat/menunggu I/O, tugas tersebut “didelegasikan” dan program melanjutkan tugas lain.
  3. Goroutines & Channels (Go / Golang)
    • Menggunakan lightweight thread yang dikelola oleh Go runtime (bukan OS). Satu program bisa menjalankan puluhan ribu goroutine sekaligus secara efisien.
    • Mengusung prinsip: “Don’t communicate by sharing memory; share memory by communicating.”
  4. Actor Model (Erlang, Elixir, Akka/Scala)
    • Setiap tugas diisolasi ke dalam “Actor” terpisah yang tidak saling berbagi memory.
    • Komunikasi antar-actor hanya terjadi melalui pesan (message passing).

Tantangan Umum dalam Concurrency

Saat mengimplementasikan concurrency, programmer biasanya harus berhadapan dengan beberapa masalah klasik:

  • Race Condition: Beberapa thread mengakses & mengubah memori terbagi bersamaan.
  • Deadlock: Kondisi di mana Thread A menunggu resource yang dipegang Thread B, sementara Thread B menunggu resource yang dipegang Thread A. Kedua thread saling mengunci resource yang dibutuhkan thread lain yang pada akhirnya memacetkan keseluruhan proses.
  • Starvation: Sebuah proses tidak pernah mendapatkan alokasi resource CPU karena selalu diserobot oleh proses lain yang prioritasnya lebih tinggi.

Mencegah Race Condition dan Deadlock adalah dua tantangan utama dalam pemrograman concurrent.

Leave a Reply

Your email address will not be published. Required fields are marked *