9.4.11.1 توضیحات #
الگو producer-consumer یکی از کاربردی ترین الگوها در زبان گو می باشد که با استفاده از الگو می توانید بطور همزمان یکسری اطلاعات تولید کنید و بفرستید داخل کانال و این اطلاعات توسط مصرف کننده بواسطه کانال دریافت شود.
معمولا برای این الگو از یک کانال دو طرفه استفاده می شود.
9.4.11.2 دیاگرام #
9.4.11.3 نمونه کد #
1package main
2
3import (
4 "fmt"
5 "math/rand"
6 "time"
7)
8
9func producer(ch chan<- int, d time.Duration) {
10 for {
11 n := rand.Intn(100)
12 ch <- n
13 fmt.Println("Produced:", n)
14 time.Sleep(d)
15 }
16}
17
18func consumer1(ch <-chan int, d time.Duration) {
19 for n := range ch {
20 fmt.Println("Consumed 1:", n)
21 time.Sleep(d)
22 }
23}
24
25func consumer2(ch <-chan int, d time.Duration) {
26 for n := range ch {
27 fmt.Println("Consumed 2:", n)
28 time.Sleep(d)
29 }
30}
31
32func main() {
33 ch := make(chan int)
34 go producer(ch, 100*time.Millisecond)
35 go consumer1(ch, 200*time.Millisecond)
36 go consumer2(ch, 200*time.Millisecond)
37
38 time.Sleep(5 * time.Second)
39}
1$ go run main.go
2Consumed 1: 81
3Produced: 81
4Produced: 87
5Consumed 2: 87
6Consumed 1: 47
7Produced: 47
8Consumed 2: 59
9Produced: 59
10Consumed 1: 81
11Produced: 81
12Consumed 2: 18
13Produced: 18
14Consumed 1: 25
15Produced: 25
در مثال فوق ما یک کانال دو طرفه ایجاد کردیم سپس این کانال را تابع producer که بصورت فقط ارسال است پاس می دهیم. پس از آن کانال را به توابع consumer1 و consumer2 به عنوان کانال فقط دریافت پاس می دهیم.
حال اطلاعات بواسطه تابع producer ایجاد می شود و به کانال ارسال می شود و هر کدام از consumer ها داده را دریافت میکنند و نمایش می دهند.
9.4.11.4 کاربردها #
- خط لوله پردازش داده: شما با استفاده از الگو producer-consumer می توانید یک خط لوله (pipeline) ایجاد کنید و داده های مورد نظر ایجاد و بواسطه producer برای consumer ها ارسال کنید.
- Logging and Monitoring: تولید کننده ها می تواننده داده های لاگ را ایجاد کنند و بوسطه کانال ها بفرستند و مصرف کننده ها می توانند این داده ها را دریافت کنند و عملیات انجام دهند.
- استریم داده: شما با استفاده از این الگو می توانید بصورت Real-time داده را از تولید کننده به مصرف کننده بفرستید تا مصرف کننده گان عملیات لازمه را انجام دهند.