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
频道读取。