【问题标题】:How to handle errors in goroutines?如何处理 goroutine 中的错误?
【发布时间】:2014-04-05 20:48:08
【问题描述】:

我正在尝试同时运行多个任务并返回结果或错误。

//data channels
    ch := make(chan int)
    ch2 := make(chan int)
    ch2 := make(chan int)
//error channels 

   errCh := make(chan error)
    errCh2 := make(chan error)
    errCh3 := make(chan error)

 //functions 
        go taskF(ch, errCh)
        go taskF2(ch2, errCh2)
        go taskF3(ch3, errCh3)

然后我开始检查每个错误。如果有任何错误我们打印它,否则我们打印每个任务的结果

      err := <-errCh
      if err != nil{
           print('we have an error ')
       return  
  }
          err2 := <-errCh2
          if err2 != nil{
           print('we have an error 2')
           return  
  }
       err3 := <-errCh3
      if err3!= nil{
           print('we have an error 3')
           return   
 }

如果没有错误,我会收集每个通道返回的值

task := <-ch
task2 := <-ch2
task3 := <-ch3

print("task %v task2 %v task3 %v", task, task2, task3)

我想知道我是否做得对。我担心代码很冗长。我正在考虑使用缓冲通道来检测错误,但我不知道如何检查所有错误。我认为以某种方式同步 goroutine 中的错误也很好,这样如果一个 goroutine 上出现错误,其他 goroutine 就会停止,但我不知道有什么方法可以解除阻塞。

【问题讨论】:

    标签: concurrency go


    【解决方案1】:

    考虑仅使用一个通道进行同步,并让此通道包含错误状态(请参阅 Result 结构)。每当您收到结果时,请确保错误状态为零。将每个任务包装在 Task 结构中将允许您在每个任务返回错误时调用 Stop 。根据您的具体应用程序,可能会有更好的方法来处理此问题,例如 WaitGroups (http://golang.org/pkg/sync/#WaitGroup)。

    type Result struct {
        Val int
        Err error
    }
    type Task struct {
         stopped bool
    }
    
    func (t *Task) Stop() {
         t.stopped = true
    }
    func (t *Task) Run(doneChan chan Result) {
        // long-running task here
        // periodically check t.stopped
        doneChan <- Result{Val: ..., Err: nil}
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2020-01-19
      相关资源
      最近更新 更多