如何处理goroutines中的错误?

时间:2014-04-05 20:48:08

标签: concurrency go

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

//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)

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

1 个答案:

答案 0 :(得分: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}
}
相关问题