Worker Pool
Konsep Utama:
Kapan Menggunakan Worker Pool?
Implementasi Worker Pool di Golang
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
// Struktur untuk mewakili tugas (job)
type Job struct {
ID int
}
// Fungsi worker yang mengambil job dari channel dan memprosesnya
func worker(id int, jobs <-chan Job, wg *sync.WaitGroup) {
defer wg.Done()
for job := range jobs {
fmt.Printf("Worker %d memproses job %d\n", id, job.ID)
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond) // Simulasi pekerjaan
}
}
func main() {
const numWorkers = 3 // Jumlah worker
const numJobs = 10 // Jumlah pekerjaan
jobs := make(chan Job, numJobs) // Channel untuk menyimpan jobs
var wg sync.WaitGroup
// Memulai worker
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go worker(i, jobs, &wg)
}
// Mengirimkan jobs ke dalam channel
for j := 1; j <= numJobs; j++ {
jobs <- Job{ID: j}
}
close(jobs) // Menutup channel jobs agar worker tahu tidak ada job baru
wg.Wait() // Menunggu semua worker selesai
fmt.Println("Semua pekerjaan telah selesai!")
}Penjelasan Kode:
Keuntungan Worker Pool
Kapan Tidak Menggunakan Worker Pool?
Best Practise Menentukan Jumlah Jobs dan Worker
1. Berdasarkan Jumlah Worker dan Sifat Pekerjaan
2. Berdasarkan Tipe Pekerjaan (CPU-Bound vs. I/O-Bound)
A. CPU-Bound (Butuh Banyak Perhitungan)
B. I/O-Bound (Sering Menunggu Respons)
3. Benchmark & Profiling
4. Contoh Implementasi Adaptif
Kesimpulan Best Practice
Jebakan Goroutine
Global Worker Pool
Pendekatan
Implementasi
Bagaimana Ini Mengatasi Masalah Developer Lain Membuat Goroutine?
Kesiumpulan
Last updated