henryspace

记录精彩的程序人生 开始使用

Part24 - Go 语言编程 - 并发编程, 生成器

并发编程,生成器

  1. 代码示例
package main

import (
	"fmt"
	"math/rand"
	"time"
)
// 并发编程:用channel来做一个生成器
func msqGen(s string) chan string{
	c := make(chan string)
	// 开一个goroutine并发
	go func() {
		i := 0
		for {
			time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond)
			c <- fmt.Sprintf("%s message %d", s,i)
			i++
		}
	}()
	return c
}

func fanIn(chs ...chan string) chan string {
	c := make(chan string)
	for _, ch := range chs {
		go func(ch chan string) {
			for{
				c <- <-ch
			}
		}(ch)
	}
	return c
}

// go select 处理方式
func fanInSelect(c1, c2 chan string) chan string {
	c := make(chan string)
	go func() {
		for {
			select {
			case m := <-c1:
				c <- m
			case m := <-c2:
				c <- m
			}
		}
	}()
	return c
}

func main() {

	// 两个channel服务句柄,发给第三个channel,用第三个统一接收数据
 	m1 := msqGen("sevice1")
 	m2 := msqGen("sevice2")
 	m  := fanIn(m1, m2)
 	//m  := fanInSelect(m1, m2)
 	for {
 		fmt.Println(<-m)
	}

结果
sevice1 message 0
sevice2 message 0
sevice1 message 1
sevice2 message 1
sevice1 message 2
sevice1 message 3
sevice1 message 4
sevice2 message 2
sevice1 message 5
sevice1 message 6
sevice2 message 3
sevice1 message 7
sevice2 message 4
sevice2 message 5
sevice1 message 8
...

}

评论
留下你的脚步