9.4.4 الگو Pooling

9.4.4 الگو Pooling

9.4.4.1 توضیحات #

شما با استفاده از الگو pooling می توانید برای استفاده مجدد یا مدیریت تعداد ثابتی از منابع مانند : کانکشن های دیتابیس یا مجموعه ای از گوروتین های کارگر استفاده کنید. از کانال برای برقراری ارتباط بین مجموع منابع استفاده می شود.

9.4.4.2 دیاگرام #

Pooling

9.4.4.3 نمونه کد #

 1package main
 2
 3import (
 4	"fmt"
 5)
 6
 7func main() {
 8	jobs := make(chan int, 100)
 9	results := make(chan int, 100)
10
11	// Start 3 worker goroutines
12	for w := 1; w <= 3; w++ {
13		go worker(w, jobs, results)
14	}
15
16	// Send 5 jobs to the worker pool
17	for j := 1; j <= 5; j++ {
18		jobs <- j
19	}
20	close(jobs)
21
22	// Collect the results
23	for a := 1; a <= 5; a++ {
24		fmt.Println(<-results)
25	}
26}
27
28func worker(id int, jobs <-chan int, results chan<- int) {
29	for j := range jobs {
30		fmt.Println("worker", id, "processing job", j)
31		results <- j * 2
32	}
33}
 1$ go run main.go
 2worker 3 processing job 1
 3worker 3 processing job 4
 4worker 3 processing job 5
 5worker 1 processing job 2
 62
 78
 810
 94
10worker 2 processing job 3
116

فرض کنید ما ۱۰۰ تسک داریم که قرار است این تسک ها را بین کارگرها تقسیم کنید و در نهایت نتیجه را از طریق کانال دریافت کنیم.

حال ما ۲ تا کانال ایجاد می کنیم با بافر ۱۰۰ تایی به نام jobs و results که قرار است ۱۰۰ تسک بواسطه این کانال ها ارسال و دریافت شود.

ما یک تابع worker داریم که jobs را دریافت میکند از طریق کانال و پس از عملیات نتیجه را داخل کانال results میفرستد.

  • کانال jobs از نوع فقط دریافتی است
  • کانال results از نوع فقط ارسال است

حال با فرض اینکه بطور موازی ۳ تا کارگر داریم که این تسک ها را دریافت می کنند و پس از انجام نتیجه را میفرستند. برای اینکه ۳ تا کارگر را ایجاد کنیم از حلقه استفاده میکنیم و تابع worker را داخل گوروتین قرا می دهیم و پس از آن jobs و results را به عنوان پارامتر ورودی به هر ورکر می دهیم.

در ادامه یک حلقه ایجاد می کنیم ۵ تا کار (job) داریم قرار است هرکدام از کارگرها توانست انجام دهد و ما کارها را از طریق کانال میفرستیم.

در نهایت یک حلقه دیگر داریم که این job ها را از طریق کانال results دریافت می کنیم و پس آن چاپ می کنیم.

9.4.4.4 کاربردها #

  • تقسیم کارهای پردازشی : شما با استفاده از این الگو می توانید پردازش یک داده سنگین را بین چند کارگر تقسیم کنید و بطور موازی این داده های سنگین در کمترین زمان پردازش می شود و جلو هزینه و سربار را میگیرد و باعث افزایش و بهبود عملکرد شود.