9.4.8.1 توضیحات #
با استفاده از الگو Bounded Work Pooling امکان محدود سازی تعداد گوروتین ها را براساس کار مشخصی دارید و گوروتین ها را محدود به تعداد دفعات کار مشخص شده محدود می شود. این الگو برای وقت مفید است که شما می خواهید منابع را به یک کار خاص محدود کنید.
9.4.8.2 دیاگرام #
9.4.8.3 نمونه کد #
1package main
2
3import (
4 "fmt"
5 "sync"
6)
7
8func main() {
9 // Create a channel to hold the tasks
10 tasks := make(chan int, 100)
11
12 // Create a WaitGroup to track the goroutines
13 var wg sync.WaitGroup
14
15 // Set the number of goroutines we want to use
16 numWorkers := 5
17
18 // Launch the goroutines
19 for i := 0; i < numWorkers; i++ {
20 wg.Add(1)
21 go func() {
22 for task := range tasks {
23 fmt.Println("Processing task", task)
24 }
25 wg.Done()
26 }()
27 }
28
29 // Add tasks to the channel
30 for i := 0; i < 20; i++ {
31 tasks <- i
32 }
33
34 // Close the channel to signal to the goroutines that there are no more tasks
35 close(tasks)
36
37 // Wait for all the goroutines to finish
38 wg.Wait()
39}
1$ go run main.go
2Processing task 2
3Processing task 4
4Processing task 5
5Processing task 6
6Processing task 7
7Processing task 8
8Processing task 10
9Processing task 11
10Processing task 12
11Processing task 13
12Processing task 14
13Processing task 15
14Processing task 16
15Processing task 17
16Processing task 18
17Processing task 19
18Processing task 3
19Processing task 9
20Processing task 0
21Processing task 1
در کد فوق ما یک کانال بافر شده با ظرفیت ۱۰۰ به نام tasks ایجاد کردیم سپس یک نمونه از WaitGroup درست کردیم. حال در متغیر numWorkers تعداد گوروتین قابل استفاده را مشخص کردیم و در ادامه داخل حلقه گوروتین برای انجام تسک ها ایجاد می کنیم که یک حلقه for-range برروی کانال tasks قرار دادیم و تسک ها را دریافت سپس پردازش می کنیم. در ادامه یک حلقه i تا ۲۰ قرار دادیم که که مقدار i را به کانال tasks میفرستد.
در نهایت پس از تکمیل شدن تسک ها کانال را میبندیم.
9.4.8.4 کاربردها #
- یکی از کاربردهای این الگو برای هندل حجم زیادی از درخواست به سرور می باشد. سرور میتواند تعداد درخواستهای همزمانی را که در هر زمان پردازش میکند محدود کند و خطر تمام شدن منابع را کاهش دهد. علاوه بر این، می تواند با اطمینان از اینکه درخواست ها به موقع پردازش می شوند، به بهبود پاسخگویی سرور کمک کند.