Go 中 实现基于 channel 的简单 生产者 消费者模型

 基础语法  2023-03-23  admin  561  757

Go 中 实现基于 channel 的简单 生产者 消费者模型

package main

import (
	"fmt"
	"strconv"
	"sync"
)

// 生产者
func producer(ch chan<- string, wg *sync.WaitGroup) {
	defer wg.Done()

	for i := 1; i <= 200; i++ {
		ch <- "生产者_1 " + strconv.Itoa(i) // 将数据发送到 channel 中
	}

	// 以便消费者可以在读取完所有数据后停止阻塞并退出
	close(ch) // 关闭 channel
}

// 生产者
func producer2(ch2 chan<- string, wg *sync.WaitGroup) {
	defer wg.Done()

	for i := 1; i <= 100; i++ {
		ch2 <- "生产者_2 " + strconv.Itoa(i) // 将数据发送到 channel 中
	}

	// 以便消费者可以在读取完所有数据后停止阻塞并退出
	close(ch2) // 关闭 channel
}

// 消费者
func consumer(ch <-chan string, wg *sync.WaitGroup, id int) {
	defer wg.Done()

	// 从 channel 中读取数据,直到 channel 关闭
	for data := range ch {
		fmt.Printf("消费者:%v 数据: %v\n", id, data)
	}
}

func main() {
	// 创建一个 channel
	ch := make(chan string, 100)
	ch2 := make(chan string, 100)

	var wg sync.WaitGroup
	wg.Add(9)

	go producer(ch, &wg)   // 启动生产者 goroutine
	go producer2(ch2, &wg) // 启动生产者 goroutine

	// 启动5个消费者 goroutine
	go consumer(ch, &wg, 1)
	go consumer(ch, &wg, 2)
	go consumer(ch, &wg, 3)
	go consumer(ch, &wg, 4)
	go consumer(ch, &wg, 5)

	go consumer(ch2, &wg, 6)
	go consumer(ch2, &wg, 7)

	// 使用 sync.WaitGroup 等待所有 goroutine 执行完毕
	wg.Wait() // 等待所有 goroutine 结束
}


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

相关推荐


酷炫的倒计时客户端

QQ: 425100867捐赠开发者:

go 的加减乘除运算注意事项,及相互转化问题

packagemain import( &quot;fmt&quot; ) funcmain(){ varintAint=10 varintBint=9 varfloatAfloat64=10 varfloatBfloat64=9 //在Go语言中,操作数的类型必须匹配。也就是说,进行运算时,操作数的类型必须一致或能够进行合理的转换。 //具体来说

AI人脸替换工具离线版V6.0 最新版下载

AI人脸替换工具离线版V6.0 最新版下载下载 解压 双击运行roop_rope_facefusion_V60.exe 文件即可下载链接:https://pan.quark.cn/s/be7953632126AI人脸替换工具离线版V6.0

Android各个版本与API等级之间的对应关系

API等级 1 - 3:Android 1.0 (Astro,也被称为“铁臂阿童木”)Android 1.1 (Petit Four,即“花色小蛋糕”)Android 1.5 (Cupcake)API等级 4:Android 1.6 (Donut)API等级 5 - 7:Android 2.0/2.0.1/2.1 (Éclair)API等级 8:Android 2.2/2.2.3 (Froyo)A