Go 写入错误通道将停止执行

Go 写入错误通道将停止执行,go,Go,我正在尝试使用sync.WorkGroup启动多个go例程,并从使用通道的工作人员那里收集错误。(这是一个好方法吗?)。每当我尝试写入错误通道时,程序似乎都会停止。我想不出原因 场景看起来是这样的- package main import ( "fmt" "time" ) func worker(id int, i int, errs chan<- errs) { defer wg.Done() errs <-

我正在尝试使用
sync.WorkGroup
启动多个go例程,并从使用通道的工作人员那里收集错误。(这是一个好方法吗?)。每当我尝试写入错误通道时,程序似乎都会停止。我想不出原因

场景看起来是这样的-

package main

import (
    "fmt"
    "time"
)

func worker(id int, i int, errs chan<- errs) {
   defer wg.Done()
   errs <- fmt.Errorf("Sample Error") // This is where the executions seems to be stuck
   return 
}

func main() {
    errs := make(chan int)
    var wg sync.WaitGroup
 
    for w := 1; w <= 3; w++ {
        wg.Add(1)
        go worker(w, w, errs)
    }
    wg.Wait()
    fmt.Printf("Hello, all tasks done.") // Never executed.
    close(errs)
    for err := range errs{
         fmt.Printf("%s", err.Error())
   }

}
主程序包
进口(
“fmt”
“时间”
)

func worker(id int,i int,errs chan如果没有其他goroutine从通道中读取,则通道写入将被阻止。当您写入错误通道时,没有其他goroutine从其读取,因此它将被阻止

您的程序有几个问题:

  • 在调用
    wg.Wait
    之前,您必须从错误通道开始读取,因为这将等待goroutines完成,但是如果您没有从错误通道读取,goroutines将不会运行
  • 您正在尝试在关闭错误通道后读取它
像这样的方法应该会奏效:

errs := make(chan int, numJobs)
go func() {
    for err := range errs{
       fmt.Printf("%s", err.Error())
 }()
for w := 1; w <= 3; w++ {
    wg.Add(1)
    go worker(w, w, results)
}
errs:=make(chan int,numJobs)
go func(){
对于错误:=范围错误{
fmt.Printf(“%s”,err.Error())
}()

对于w:=1;w,您正在等待goroutines返回,然后再尝试从
errs
频道读取。