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:
- Generator: Menghasilkan angka-angka.
- Multiplier: Mengalikan setiap angka dengan faktor tertentu.
- 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:
Penjelasan Mekanisme:
Generator:
- Fungsi
generatormenerima deretan angka dan mengirimkannya ke channeloutsecara berurutan. - Setelah semua angka dikirim, channel
outditutup.
- Fungsi
Multiplier:
- Fungsi
multipliermenerima channel input (in) dan untuk setiap angka yang diterima, ia mengalikan angka tersebut dengan nilaifactor(misal 2). - Hasilnya dikirim ke channel
outmilik tahap ini. - Setelah channel input ditutup dan semua data telah diproses, channel
outjuga ditutup.
- Fungsi
Adder:
- Fungsi
addermenerima channel darimultiplierdan menambahkan nilaiaddend(misal 3) ke setiap angka yang diterima. - Hasil akhirnya dikirim ke channel
outdan setelah selesai, channel ditutup.
- Fungsi
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 channelsum. Loopfor rangeakan terus membaca sampai channelsumditutup.
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!