繁体   English   中英

如何处理goroutines中的错误?

[英]How to handle errors in goroutines?

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

//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会停止但我不知道以任何方式以非阻塞的方式做。

考虑仅使用一个通道进行同步,并使此通道包含错误状态(请参阅结构结构)。 每当收到结果时,请确保错误状态为零。 在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}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM