GoDasturchi
Worker Pools: Bounded Concurrency

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.

example.go
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.

Hints (0/4)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/4)

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