我试图同时运行多个任务并返回结果或错误。
//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就会停止,但我不知道以任何方式以无阻塞的方式做。
答案 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}
}