Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 如何处理goroutines中的错误?_Concurrency_Go - Fatal编程技术网

Concurrency 如何处理goroutines中的错误?

Concurrency 如何处理goroutines中的错误?,concurrency,go,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

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

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

err:=考虑只使用一个通道进行同步,并让该通道包含错误状态(请参见结果结构)。无论何时收到结果,请确保错误状态为零。在任务结构中包装每个任务将允许您在每个任务返回错误时调用Stop。根据具体的应用程序,可能有更好的方法来处理此问题,例如WaitGroups()

类型结果结构{
Val int
错误
}
类型任务结构{
阻止布尔
}
函数(t*任务)停止(){
t、 停止=真
}
func(t*任务)运行(doneChan chan结果){
//这里的长期运行任务
//定期检查t
多尼坎
task := <-ch
task2 := <-ch2
task3 := <-ch3

print("task %v task2 %v task3 %v", task, task2, task3)
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}
}