9.4.17 الگو Queuing

9.4.17 الگو Queuing

9.4.17.1 توضیحات #

الگوی “صف” در زبان گو الگویی است که در آن از یک گوروتین برای بافر کردن و مدیریت ترتیب مقادیر ارسال شده و دریافت شده از یک کانال استفاده می شود.

9.4.17.2 دیاگرام #

9.4.17.3 نمونه کد #

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6	// Declare the queue channel with a buffer size of 5
 7	queue := make(chan int, 5)
 8
 9	// Send values to the queue
10	go func() {
11		for i := 0; i < 10; i++ {
12			queue <- i
13			fmt.Println("Sent:", i)
14		}
15		close(queue)
16	}()
17
18	// Receive values from the queue
19	for value := range queue {
20		fmt.Println("Received:", value)
21	}
22}
 1$ go run main.go
 2Sent: 0
 3Received: 0
 4Received: 1
 5Sent: 1
 6Sent: 2
 7Sent: 3
 8Sent: 4
 9Sent: 5
10Sent: 6
11Sent: 7
12Received: 2
13Received: 3
14Received: 4
15Received: 5
16Received: 6
17Received: 7
18Received: 8
19Sent: 8
20Sent: 9
21Received: 9

در کد فوق ما یک کانال بافر شده با ظرفیت ۵ ایجاد کردیم. سپس داخل یک گوروتین یک حلقه قرار داده از i تا ۱۰ و مقدار i را به کانال فرستادیم و در نهایت کانال را بستیم. سپس یکی حلقه for-range برروی کانال قرار دادیم و مقادیر را دریافت کردیم و سپس چاپ کردیم.

9.4.17.4 کاربردها #

  • زمان‌بندی کار (Task scheduling): یک کانال می‌تواند به عنوان صف برای نگه‌داشتن وظایفی که باید توسط یک گوروتین worker اجرا و استفاده شود. کارگر وظایف را به ترتیبی که اضافه شده اند از صف می گیرد و آنها را پردازش می کند.
  • بافر کردن داده ها: یک کانال می تواند به عنوان یک بافر برای نگهداری داده های ورودی قبل از پردازش توسط گوروتین دیگر استفاده شود. این می تواند زمانی مفید باشد که سرعت پردازش داده ها کندتر از سرعت دریافت آن باشد.
  • Throttling: یک کانال می تواند به عنوان یک صف برای محدود کردن سرعت پردازش داده ها توسط یک گوروتین استفاده شود. با افزودن یک بافر به کانال، زمانی که بافر پر شود، گوروتین ارسال کننده مسدود می شود و به طور موثر سرعت ارسال داده ها را کاهش می دهد.
  • Logging: یک کانال می تواند به عنوان یک صف برای نگهداری پیام های گزارشی که باید در یک فایل نوشته شود یا از طریق شبکه ارسال شود استفاده شود. کارگر گوروتین پیام‌های گزارش را به ترتیبی که اضافه شده‌اند از صف می‌گیرد و در فایل گزارش می‌نویسد.
  • Multi-threading: یک کانال می تواند به عنوان یک صف برای به اشتراک گذاری داده ها بین گوروتین های مختلف و مدیریت همزمانی برنامه استفاده شود.