- 设计方案描述:
- 使用一个带缓冲的
chan error
来收集各个 Goroutine
产生的错误。
- 使用
sync.WaitGroup
来等待所有 Goroutine
完成。
- 为了保证并发安全,每个
Goroutine
只向 chan error
发送错误,在主 Goroutine
中统一从 chan error
接收错误并处理。
- Go代码实现:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup, errChan chan error) {
defer wg.Done()
// 模拟可能出错的任务
if id%2 == 0 {
errChan <- fmt.Errorf("worker %d encountered an error", id)
} else {
fmt.Printf("worker %d completed successfully\n", id)
}
}
func main() {
var wg sync.WaitGroup
errChan := make(chan error, 10)
numWorkers := 5
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(i, &wg, errChan)
}
go func() {
wg.Wait()
close(errChan)
}()
for err := range errChan {
fmt.Println(err)
}
}