- 使用
sync.WaitGroup
和 chan
实现:
- 可以利用
sync.WaitGroup
来等待所有的 goroutine
完成,同时使用一个 chan
来收集每个 goroutine
执行过程中返回的错误。
- 以下是示例代码:
package main
import (
"fmt"
"sync"
)
func task(i int) error {
// 模拟可能出错的任务
if i == 2 {
return fmt.Errorf("task %d failed", i)
}
return nil
}
func main() {
var wg sync.WaitGroup
errorChan := make(chan error)
numTasks := 3
for i := 0; i < numTasks; i++ {
wg.Add(1)
go func(taskID int) {
defer wg.Done()
err := task(taskID)
if err != nil {
errorChan <- err
}
}(i)
}
go func() {
wg.Wait()
close(errorChan)
}()
var errors []error
for err := range errorChan {
errors = append(errors, err)
}
if len(errors) > 0 {
fmt.Println("Encountered errors:")
for _, err := range errors {
fmt.Println(err)
}
} else {
fmt.Println("All tasks completed successfully")
}
}
- 代码说明:
- 任务函数
task
:模拟了一个可能返回错误的任务。这里简单地设置当 i
等于 2
时返回错误。
main
函数:
- 首先创建了一个
sync.WaitGroup
和一个用于收集错误的 errorChan
。
- 通过循环启动多个
goroutine
,每个 goroutine
执行 task
函数,并在完成后调用 wg.Done()
。如果 task
执行出错,将错误发送到 errorChan
。
- 使用一个单独的
goroutine
等待所有 goroutine
完成(wg.Wait()
),然后关闭 errorChan
。
- 最后通过
for... range
从 errorChan
中读取所有错误,并统一进行处理。如果有错误,打印错误信息;如果没有错误,打印任务成功完成的消息。