首页 > 其他 > 详细

Golang基于Channel的生产消费模式实现

时间:2020-07-15 16:07:52      阅读:39      评论:0      收藏:0      [点我收藏+]

先贴代码,有错误请指正

package main

import (
	"log"
	"sync"
	"time"
)

var (
	task    chan int = make(chan int, 10)
	done    chan int = make(chan int, 10)
	wg_task sync.WaitGroup
	wg_done sync.WaitGroup
)

func produce(task_count int) {
	defer wg_task.Done()

	for i := 0; i < task_count; i++ {
		task <- i
		log.Printf("send task : [%d]", i)
	}
	close(task)
}

func consumer(i int) {
	defer wg_task.Done()
	for {
		v, ok := <-task
		log.Printf("recv task [%d]: [%d] [%v]", i, v, ok)
		if !ok {
			break
		}

		done <- v
		time.Sleep(20 * time.Millisecond)
	}
}

func consumer_done() {
	defer wg_done.Done()
	for {
		v, ok := <-done
		log.Printf("finished : [%d] [%v]", v, ok)
		if !ok {
			break
		}
	}
}

func main() {

	wg_task.Add(1)
	go produce(1000)

	for i := 0; i < 10; i++ {
		wg_task.Add(1)
		go consumer(i)
	}

	wg_done.Add(1)
	go consumer_done()

	wg_task.Wait()
	close(done)

	wg_done.Wait()
}

Golang基于Channel的生产消费模式实现

原文:https://www.cnblogs.com/jobgeo/p/13305215.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!