9.4.2 الگو Fan Out/In

9.4.2 الگو Fan Out/In

9.4.2.1 توضیحات #

الگو Fan Out/In یک تکنیک همزمانی در زبان گو می باشد که به شما اجازه می دهد چندین کار را با گوروتین همزمان انجام دهید و در نتیجه خروجی این کارها را با هم ترکیب کنید و به عنوان نتیجه نهایی دریافت کنید.

9.4.2.2 دیاگرام #

Fan out/in

9.4.2.3 نمونه کد #

فرض کنید قصد دارید یک برنامه ای بنویسید که چندین فایل بصورت موازی دانلود کنید و در نهایت محتوای این فایل را میخواهید ترکیب کنید و یک خروجی داشته باشید.

در زیر یک مثال ساده زدیم :

 1package main
 2
 3import (
 4	"fmt"
 5	"sync"
 6)
 7
 8func main() {
 9	urls := []string{"url1", "url2", "url3"}
10	var wg sync.WaitGroup
11
12	// Fan out: Launch goroutines to download files
13	results := make(chan string)
14	for _, url := range urls {
15		wg.Add(1)
16		go func(url string) {
17			defer wg.Done()
18			result := downloadFile(url)
19			results <- result
20		}(url)
21	}
22
23	// Fan in: Combine results from goroutines
24	go func() {
25		wg.Wait()
26		close(results)
27	}()
28
29	var output string
30	for result := range results {
31		output += result
32	}
33	fmt.Println(output)
34}
35
36func downloadFile(url string) string {
37	// code to download file from url
38	return "file contents"
39}
1$ go run main.go
2file contentsfile contentsfile contents

در بالا ما یکسری url داریم میخواهیم بصورت موازی فایل هایی را دانلود کنید. حال با توجه به تعداد url ها یک گوروتین ایجاد میکنیم که بصورت موازی شروع به دانلود فایل کنند و نتیجه را داخل کانال results بفرستند. در اینجا ما با کمک WaitGroup منتظر نتیجه کلی عملیات گوروتین ها می شویم و در نهایت پس از اینکه گوروتین ها کارشان اتمام شد. ما با کمک حلقه for-range داده ها را از کانال results دریافت می کنیم و این داده ها را باهم ترکیب میکنیم.

9.4.2.4 کاربردها #

  • پردازش داده (Data Processing) : شما با استفاده از الگو Fan Out/In بصورت موازی می توانید مقادیری زیاده از داده ها را پردازش کنید. به عنوان مثال شما یک داده بزرگی را دارید قصد دارید پردازشی برروی این داده انجام حال می توانید این داده را به بخش های کوچکتری بین گوروتین ها تقسیم کنید تا بصورت موازی پردازش شود در نهایت خروجی های پردازش شده را با هم ترکیب کنید.
  • Web Scarping : شما با استفاده از الگو Fan Out/In می توانید چندین Scraping وب سایت را بطور همزمان ایجاد کنید و پس از آن نتایج را ترکیب کنید. به عنوان مثال شما بطور موازی چندین گوروتین را برای Web Scaring صفحات مختلف یک وب سایت ایجاد می کنید و با استفاده از کانال نتایج را جمع آوری میکند و در نهایت برروی این نتایج پردازش و در یک دیتابیس ذخیره می کنید.
  • محاسبات توزیع شده (Distributed computing) : برای انجام محاسبات توزیع شما می توانید از الگو Fan Out/In استفاده کنید و چندین گوروتین را برای انجام یک در Machine های مختلف راه اندازی کنید و سپس از یک کانال برای جمع آوری داده استفاده کنید. سپس گوروتین اصلی می توانید نتایج حاصل از را از تمامی node ها جمع آوری کند و یک خروجی ترکیب شده ایجاد کند.
  • شبکه : با استفاده از الگو Fan Out/In می توانید برای مدیریت همزمان چندین کانکشن ورودی و سپس ترکیب نتایج استفاده کنید. به عنوان مثال می توانید چندین گوروتین را برای مدیریت کانکشن های ورودی راه اندازی کنید و سپس از یک کانال برای جمع آودری نتایج استفاده کنید. پس از پردازش و ترکیب نتایج این نتایج را به عنوان خروجی به کلاینت نمایش دهد.