go - 在 go 中将多条消息发送到一个频道进行整理
问题描述
我正试图把我的思绪绕过去。我想做一个简单的程序,基本上
- 开始一堆 goroutine
- 处理消息
- 将处理后的结果发送到通道
- 让主线程收集这些结果
- 关闭。
看起来很简单。我一开始完全没有逻辑。我只是发送一个号码并尝试取回那个号码。
问题:我陷入僵局,我不知道为什么。我想我可能会滥用带有通道的等待组,因为它们是单独工作的,但我不确定如何让主线程阻塞任意数量的启动 go 例程。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
queue := make(chan int)
start := time.Now()
var wg sync.WaitGroup
for i := 0; i < 10; i += 1 {
wg.Add(1)
go count(i, queue, &wg)
}
wg.Wait()
for value := range queue {
println(value)
}
close(queue)
fmt.Println(time.Now().Sub(start))
// fmt.Println(summation)
}
func count(number int, queue chan int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Starting ", number)
queue <- number
fmt.Println("ending")
}
解决方案
你的 goroutines 阻塞,queue <- number
因为queue
它是一个无缓冲的通道,没有人从它读取,作为wg.Wait
.
改为声明queue
为缓冲通道。例如:queue := make(chan int, 10)
从Go Tour(并发)和后续页面:
默认情况下,发送和接收阻塞,直到对方准备好。这允许 goroutines 在没有显式锁或条件变量的情况下进行同步。
仅当缓冲区已满时才发送到缓冲通道块。当缓冲区为空时接收块。
或者,wg.Wait
在for v := range queue
循环之后移动。
推荐阅读
- vue.js - Vuetify Dark 主题存储在 cookie 和 localStorage 在 Nuxt SSR 中的 created() 钩子中不可用,我看到明暗主题之间闪烁
- python - 对于 mac 用户,os.startfile() 的替代方法是什么?
- python - Flask:在新会话开始时调用的函数
- r - 使用 R 中的日期变量对数据进行分类
- reactjs - React Native 中的 GetElementById 等效项
- dns - DNS CNAME 从某处推送
- linux - xdotool 键在 .sh 脚本中不执行任何操作
- awk - awk 命令字段分隔符
- flutter - 如何仅显示当前用户的帖子?
- excel - Word 文档无法正确关闭