为了账号安全,请及时绑定邮箱和手机立即绑定

写入错误通道会停止执行

写入错误通道会停止执行

Go
蝴蝶刀刀 2022-06-21 10:20:53
我正在尝试sync.WorkGroup使用通道启动多个 go-routines,并从这些工作人员那里收集错误。(这是一个好方法吗?)。每当我尝试写入错误通道时,程序似乎都会停止。无法弄清楚它的原因。场景看起来像这样 -package mainimport (    "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())   }}
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果没有其他 goroutine 从它读取,则通道写入将阻塞。当您写入错误通道时,没有其他 goroutine 从它读取,因此它会阻塞。

你的程序有几个问题:

  • 您必须在调用之前从错误通道开始读取wg.Wait,因为这将等待 goroutine 完成,但如果您不从错误通道读取,goroutine 将不会运行。

  • 关闭错误通道后,您正尝试从错误通道中读取。

像这样的东西应该工作:

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)

}


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号