Pola Worker Pool
Batasi konkurensi
Pola Worker Pool adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Apa Itu Kumpulan Pekerja
Kumpulan worker menjalankan sejumlah gorutin yang tetap, yang semuanya mengambil pekerjaan dari kanal bersama. Alih-alih membuat satu gorutin untuk setiap tugas, Anda membuat N pekerja dan memberi mereka pekerjaan.
- Membatasi jumlah operasi serentak
- Menggunakan kembali gorutin daripada membuat ribuan gorutin
- Melindungi sumber daya bersama seperti basis data atau API
Mengapa Konkurensi Perlu Dibatasi
Gorutin yang tidak dibatasi dapat menghabiskan memori dan deskriptor berkas, atau membebani layanan hilir. Kumpulan ini memberi Anda kendali untuk mengatur seberapa banyak pekerjaan yang berjalan sekaligus.
Jika Anda memiliki 10000 URL untuk diambil, Anda tidak ingin 10000 permintaan HTTP berlangsung bersamaan. Kumpulan berisi 20 pekerja membuatnya tetap terkendali.
Kanal jobs
Pekerjaan mengalir ke kanal jobs. Setiap worker membacanya dalam perulangan for range. Saat kanal ditutup, perulangan berakhir dan worker keluar.
jobs := make(chan int, 100)
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)Satu Pekerja
worker hanyalah fungsi yang melakukan iterasi pada kanal jobs. worker tersebut memproses setiap pekerjaan dan menulis hasilnya ke kanal hasil.
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}Menjalankan Beberapa Pekerja
Jalankan kumpulan tersebut dengan perulangan sederhana. Setiap iterasi memulai satu gorutin yang menjalankan fungsi worker yang sama. Semuanya berbagi kanal jobs dan hasil yang sama.
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}Tipe Kanal Searah
Perhatikan <-chan int (hanya menerima) dan chan<- int (hanya mengirim) pada tanda tangan worker. Tipe searah ini memungkinkan kompilator mencegah worker mengirim secara tidak sengaja ke jobs atau membaca dari hasil.
Mengumpulkan Hasil
Setelah memasukkan semua pekerjaan dan menutup kanal, gorutin main membaca hasil sebanyak jumlah pekerjaan. Ini menyinkronkan program agar tidak berakhir terlalu cepat.
sum := 0
for a := 1; a <= 5; a++ {
sum += <-results
}
fmt.Println("total:", sum)Kumpulan yang Lengkap dan Dapat Dijalankan
Berikut pola lengkap dalam satu program: tiga pekerja menggandakan lima angka. Jalankan program tersebut dan amati jumlah totalnya.
package main
import "fmt"
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}
func main() {
jobs := make(chan int, 5)
results := make(chan int, 5)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
total := 0
for a := 1; a <= 5; a++ {
total += <-results
}
fmt.Println("total:", total)
}Dengan Penyangga vs Tanpa Penyangga
Kanal jobs dengan penyangga memungkinkan produsen mengantrekan pekerjaan tanpa terblokir hingga penyangga penuh. Kanal tanpa penyangga memaksa serah terima: pengiriman terblokir hingga seorang pekerja siap. Penyangga memperlancar produsen yang menghasilkan pekerjaan secara berkelompok.
Memilih Ukuran Kumpulan
Untuk pekerjaan yang bergantung pada CPU, tetapkan ukuran kumpulan mendekati runtime.NumCPU(). Untuk pekerjaan yang bergantung pada IO (jaringan dan penyimpanan), Anda dapat menggunakan jumlah yang jauh lebih tinggi karena pekerja menghabiskan waktu untuk menunggu, bukan menghitung.
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("CPUs:", runtime.NumCPU())
}Menghindari Kebocoran Gorutin
Jika Anda lupa menjalankan close(jobs), worker akan menunggu selamanya pada kanal kosong dan mengalami kebocoran. Selalu tutup kanal jobs setelah semua pekerjaan dikirim agar perulangan for range berakhir.
Pemeriksaan Singkat
Uji pemahaman Anda tentang kumpulan worker.
Ringkasan
Anda telah mempelajari pola kumpulan worker:
- Jalankan jumlah worker tetap yang membaca dari kanal pekerjaan bersama
- Gunakan tipe kanal searah demi keamanan
- Tutup kanal pekerjaan untuk menghentikan worker
- Kumpulkan hasil untuk menyinkronkan penyelesaian
- Tentukan ukuran kumpulan berdasarkan jenis beban kerja (CPU atau IO)
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola Worker Pool” gratis?
Ya — teks lengkap “Pola Worker Pool” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pola Worker Pool”?
Batasi konkurensi Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Pola Worker Pool” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pola Worker Pool
- Fan-Out Fan-In
- Tahap Pipeline
- Penghentian yang Mulus