package main
import (
"fmt"
"sync"
)
func worker(wg *sync.WaitGroup) {
defer wg.Done()
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in worker:", r)
}
}()
// 模拟可能发生panic的操作
panic("Some error occurred")
}
func main() {
var wg sync.WaitGroup
numWorkers := 3
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(&wg)
}
go func() {
wg.Wait()
fmt.Println("All workers have finished")
}()
// 模拟主goroutine等待一段时间
select {}
}
- worker函数:
defer wg.Done()
用于通知WaitGroup
该goroutine已完成。
- 使用
defer
和recover
来捕获可能发生的panic
。如果发生panic
,recover
会捕获到,并在worker
内部处理,不会影响其他goroutine。
- main函数:
- 使用
WaitGroup
来等待所有worker
goroutine完成。
- 在一个单独的goroutine中调用
wg.Wait()
,并在其完成后打印消息,表明所有worker
已完成。
select {}
是为了防止主goroutine
退出,让程序持续运行直到所有worker
完成。这样就确保了在主goroutine
中不会因为某个worker
的panic
而异常退出,同时其他goroutine
也能正常结束或得到相应处理。