Worker Pools: Bounded Concurrency
Worker pool: chegaralangan concurrency
Goroutinalar darsida har bir element uchun alohida goroutina ishga tushirdingiz. 5 ta element uchun bu yaxshi, lekin 5 million uchun-chi? Bir vaqtning o'zida million goroutina — xotira va rejalashtirish narxi katta bo'lishi mumkin. Yechim — worker pool: qat'iy sonli "ishchi" goroutinalar, ular vazifalarni umumiy kanaldan olib bajaradi.
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results) // faqat 3 ta doimiy ishchi
}Bu — Buffered Channels va Channel Directions darslarining tabiiy davomi: jobs kanali vazifalar navbati, results kanali esa natijalar navbati bo'lib xizmat qiladi. Har bir ishchi jobsdan range qilib, kanal yopilguncha ishlayveradi — bu ishchilar sonini vazifalar sonidan mustaqil qiladi.
>_ Exercise
worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) funksiyasini yozing — jobs kanali ustidan range qilib, har bir sonning kvadratini resultsga yuboradi, tugagach wg.Done() chaqiradi. RunWorkerPool(nums []int, numWorkers int) int funksiyasini yozing: jobs va results buferlangan kanallarini yarating, numWorkers ta ishchini ishga tushiring, numsni jobsga yuboring va yoping, barcha ishchilar tugashini kuting, resultsni yoping, so'ngra barcha natijalarning yig'indisini qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Worker pool — qat'iy sonli ishchi goroutinalarni umumiy vazifalar kanali bilan birlashtirib, concurrency darajasini nazorat qiladi. Bu naqsh ko'p sonli kichik vazifalarni cheklangan resurs (masalan, tarmoq ulanishlari yoki CPU yadrolari) bilan qayta ishlashda standart yechimdir.
NEXT UP
Context: Cancellation and Timeouts
$ go run main.go
Kodingizni ishga tushiring