golang并发 04-并发模式

pipeline模式

在这里插入图片描述

//pipeline模式
func Pipeline() {
	fmt.Println("---开始工作---")
	coms := parts(10)
	part := process(coms)
	out(part)
	time.Sleep(100 * time.Second)
}

func parts(num int) <-chan int {
	ch := make(chan int, 5)
	go func() {
		defer close(ch)
		for i := 1; i <= num; i++ {
			ch <- i
			time.Sleep(1 * time.Second)
		}
	}()
	return ch
}

func process(ch <-chan int) chan string {
	ch2 := make(chan string, 5)
	go func() {
		defer close(ch2)
		for c := range ch { //没有数据会一直堵塞,直到关闭通道
			ch2 <- "组装" + strconv.Itoa(c)
		}
	}()
	return ch2
}

func out(ch <-chan string) {
	go func() {
		for k := range ch {
			fmt.Println("整合" + k + ",进行发送")
		}
	}()
}

  • 流水线由一道道工序构成,每道工序通过channel把数据传递到下一个工序
  • 每道工序一般会对应一个函数,函数里有协程和channel协程一般用于处理数据并把它放入channel中整个函数会返回这个channel以供下一道工序使用
  • 最终要有一个组织者(示例中的main函数)把这些工序串起来

扇出扇入模式

在这里插入图片描述

func merge(ins ...<-chan string) <-chan string {
	out := make(chan string)
	var wg sync.WaitGroup
	wg.Add(len(ins))

	//把每个管道中的值给out
	p := func(in <-chan string) {
		defer wg.Done()
		for c := range in {
			out <- c
		}
	}

	//依次处理多个管道
	for _, sc := range ins {
		go p(sc)
	}

	//等所有管道处理完,就关闭out
	go func() {
		wg.Wait()
		close(out)
	}()
	
	return out
}

Futures模式

在实际需求中,有大量的任务之间相互独立、没有依赖所以为了提高性能,这些独立的任务就可以并发执行

//未来模式
func Funture() {
	veg := vegetables()
	wa := water()

	fmt.Println("已经安排洗菜和烧水了")
	time.Sleep(3 * time.Second)

	fmt.Println("看看水和菜可以了没")
	vegs := <-veg
	was := <-wa

	fmt.Println(vegs, was, "开始做火锅")
}

func water() <-chan string {
	wa := make(chan string)
	go func() {
		time.Sleep(3 * time.Second)
		wa <- "烧好水了"
	}()
	return wa
}

func vegetables() <-chan string {
	veg := make(chan string)
	go func() {
		time.Sleep(3 * time.Second)
		veg <- "洗好菜了"
	}()
	return veg
}

- - - 以后在实战中继续更新 - - -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值