Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多条消息发送到go中的一个通道以进行排序_Go_Channels - Fatal编程技术网

将多条消息发送到go中的一个通道以进行排序

将多条消息发送到go中的一个通道以进行排序,go,channels,Go,Channels,我正试着绕着围棋转。我想做一个简单的程序,基本上 开始一系列的围棋程序 处理消息 将处理后的结果发送到通道 让主线程收集这些结果 关闭 看起来很简单。我一开始就毫无逻辑可言。我只是发送一个号码,然后试着找回那个号码 问题:我的僵局,我不知道为什么。我想我可能在通道中误用了等待组,因为它们单独工作,但我不确定如何让主线程阻止任意数量的启动go例程 主程序包 进口( “fmt” “同步” “时间” ) func main(){ 队列:=make(chan int) 开始:=时间。现在() var w

我正试着绕着围棋转。我想做一个简单的程序,基本上

  • 开始一系列的围棋程序
  • 处理消息
  • 将处理后的结果发送到通道
  • 让主线程收集这些结果
  • 关闭
  • 看起来很简单。我一开始就毫无逻辑可言。我只是发送一个号码,然后试着找回那个号码

    问题:我的僵局,我不知道为什么。我想我可能在通道中误用了等待组,因为它们单独工作,但我不确定如何让主线程阻止任意数量的启动go例程

    主程序包
    进口(
    “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;ie、 数据为避免死锁,您可以在单独的goroutine中管理通道和等待组。请尝试更改:

        wg.Wait()
    
        for value := range queue {
            println(value)
        }
    
        close(queue)
    
    为此:

        go func() {
            wg.Wait()
            close(queue)
        }()
        for value := range queue {
            println(value)
        }
        
    

    这是有道理的,谢谢。我确实在范围之后尝试了
    等待
    ,但是您最终遇到了类似的线程死锁问题。