将多条消息发送到go中的一个通道以进行排序
我正试着绕着围棋转。我想做一个简单的程序,基本上将多条消息发送到go中的一个通道以进行排序,go,channels,Go,Channels,我正试着绕着围棋转。我想做一个简单的程序,基本上 开始一系列的围棋程序 处理消息 将处理后的结果发送到通道 让主线程收集这些结果 关闭 看起来很简单。我一开始就毫无逻辑可言。我只是发送一个号码,然后试着找回那个号码 问题:我的僵局,我不知道为什么。我想我可能在通道中误用了等待组,因为它们单独工作,但我不确定如何让主线程阻止任意数量的启动go例程 主程序包 进口( “fmt” “同步” “时间” ) func main(){ 队列:=make(chan int) 开始:=时间。现在() var w
主程序包
进口(
“fmt”
“同步”
“时间”
)
func main(){
队列:=make(chan int)
开始:=时间。现在()
var wg sync.WaitGroup
对于i:=0;i<10;i+=1{
工作组.添加(1)
转到计数(i、队列和工作组)
}
wg.Wait()
对于值:=范围队列{
println(值)
}
关闭(队列)
fmt.Println(time.Now().Sub(start))
//格式打印项次(总和)
}
func计数(数字int、队列chan int、wg*sync.WaitGroup){
推迟工作组完成()
fmt.Println(“起始”,编号)
队列您的goroutines阻塞在队列上,这应该会有所帮助
主程序包
进口(
“fmt”
“同步”
“时间”
)
类型事件结构{
数据传输字符串
numWorker int
}
func(e事件)Send(){
var wg sync.WaitGroup
//将消息发送到的Spaw numWorker goroutines
//同一频道。
对于i:=0;i e、 数据为避免死锁,您可以在单独的goroutine中管理通道和等待组。请尝试更改:
wg.Wait()
for value := range queue {
println(value)
}
close(queue)
为此:
go func() {
wg.Wait()
close(queue)
}()
for value := range queue {
println(value)
}
这是有道理的,谢谢。我确实在范围之后尝试了等待
,但是您最终遇到了类似的线程死锁问题。