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

 基础语法  2023-03-23  admin  650  877

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 结束
}


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

相关推荐


go 在Windows系统中交叉编译临时环境变量设置

go 编译临时环境变量设置并 交叉编译命令$env:GOOS=&quot;linux&quot;;$env:GOARCH=&quot;amd64&quot;;gobuild-ofilenametest.go$env:GOOS=&quot;linux&quot;;$env:GOARCH=&quot;amd64&quot;;`gobuild-ofilenametest.go`这两种方式 都是在Powe

phpstorm 设置 外部命令

C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.20.11781.0_x64__8wekyb3d8bbwe\wt.exe-d $ContentRoot$$ProjectFileDir$

点名工具,抽奖软件

点名工具,抽奖软件

酷炫的倒计时客户端

QQ: 425100867捐赠开发者: