Lompat ke konten Lompat ke sidebar Lompat ke footer

Golang Concurrency #11

 Berikut adalah contoh lain yang menunjukkan pola pipeline untuk memproses data secara konkuren. Pola pipeline memungkinkan kamu untuk memecah proses menjadi beberapa tahap (stage) yang berjalan bersamaan, di mana output dari satu tahap menjadi input bagi tahap berikutnya.


Contoh: Pipeline Sederhana (Generator → Multiplier → Adder)

Misalkan kita memiliki deretan angka, lalu kita ingin:

  1. Generator: Menghasilkan angka-angka.
  2. Multiplier: Mengalikan setiap angka dengan faktor tertentu.
  3. Adder: Menambahkan nilai tertentu ke setiap angka yang sudah dikalikan.

Kode di bawah ini menunjukkan bagaimana ketiga tahap tersebut diimplementasikan secara konkuren menggunakan goroutine dan channel:

package main import ( "fmt" ) // generator: Menghasilkan angka dan mengirimkannya ke channel. func generator(nums ...int) <-chan int { out := make(chan int) go func() { for _, n := range nums { out <- n // Kirim angka ke channel } close(out) // Tutup channel setelah selesai }() return out } // multiplier: Menerima angka dari channel, mengalikannya dengan factor, dan mengirim ke channel berikutnya. func multiplier(in <-chan int, factor int) <-chan int { out := make(chan int) go func() { for n := range in { out <- n * factor } close(out) // Tutup channel setelah selesai memproses }() return out } // adder: Menerima angka dari channel, menambahkan addend, dan mengirim ke channel berikutnya. func adder(in <-chan int, addend int) <-chan int { out := make(chan int) go func() { for n := range in { out <- n + addend } close(out) }() return out } func main() { // Tahap 1: Generator menghasilkan angka gen := generator(1, 2, 3, 4, 5) // Tahap 2: Multiplier mengalikan setiap angka dengan 2 mul := multiplier(gen, 2) // Tahap 3: Adder menambahkan 3 ke setiap hasil perkalian sum := adder(mul, 3) // Membaca hasil akhir dari pipeline for result := range sum { fmt.Println(result) } }

Penjelasan Mekanisme:

  1. Generator:

    • Fungsi generator menerima deretan angka dan mengirimkannya ke channel out secara berurutan.
    • Setelah semua angka dikirim, channel out ditutup.
  2. Multiplier:

    • Fungsi multiplier menerima channel input (in) dan untuk setiap angka yang diterima, ia mengalikan angka tersebut dengan nilai factor (misal 2).
    • Hasilnya dikirim ke channel out milik tahap ini.
    • Setelah channel input ditutup dan semua data telah diproses, channel out juga ditutup.
  3. Adder:

    • Fungsi adder menerima channel dari multiplier dan menambahkan nilai addend (misal 3) ke setiap angka yang diterima.
    • Hasil akhirnya dikirim ke channel out dan setelah selesai, channel ditutup.
  4. Pipeline Secara Keseluruhan:

    • Setiap tahap berjalan di goroutine-nya sendiri.
    • Output dari satu tahap langsung diteruskan sebagai input ke tahap berikutnya.
    • Karena channel digunakan, setiap tahap akan blocking saat tidak ada data, sehingga menjaga aliran data secara sinkron meskipun diproses secara konkuren.
    • Di fungsi main, kita hanya membaca hasil akhir dari channel sum. Loop for range akan terus membaca sampai channel sum ditutup.

Keuntungan Pola Pipeline:

  • Parallelisme & Modularitas:
    Setiap tahap dapat berjalan bersamaan, sehingga jika suatu tahap memerlukan waktu, tahap lainnya tetap bisa memproses data yang sudah tersedia.
    Proses dipecah menjadi bagian-bagian kecil yang mudah dipahami dan diuji secara terpisah.

  • Komunikasi Aman dengan Channel:
    Data mengalir antar tahap melalui channel, sehingga tidak perlu menggunakan sinkronisasi manual (misal mutex) untuk berbagi data antar goroutine.

  • Fleksibilitas:
    Kamu dapat dengan mudah menambahkan atau memodifikasi tahap-tahap dalam pipeline sesuai kebutuhan, seperti menambahkan tahap filtering atau transformasi data lainnya.


Pola pipeline ini merupakan contoh efisien dalam concurrency karena dapat meningkatkan throughput dan memanfaatkan sumber daya secara optimal tanpa membuat program menjadi rumit. Jika ada pertanyaan atau kamu ingin melihat contoh lain, silakan tanya!