在过去的一天左右的时间里,我一直在努力解决一个问题,寻找创建 N 个并发函数的最佳方法,这些函数在 Go 中以相同的时间间隔定期调用。我希望能够指定任意数量的函数,让它们全部同时定期运行,并在指定的时间后结束它们。
现在我有一个可行的解决方案,但必须为每个并发函数创建一个新的代码。我也不确定如何正确使用sync.WaitGroup,因为我当前的实现导致程序永远不会结束(最后卡在 wg.Wait() 上)
func main() {
N := 10
var wg sync.WaitGroup
wg.Add(N)
quit := make(chan struct{})
for i := 0; i < N; i++ {
tick := time.NewTicker(500 * time.Millisecond)
go func(t *time.Ticker) {
for a := range tick.C {
select {
case <-quit:
break
default:
fmt.Println(a) // do something on tick
}
}
wg.Done()
}(tick)
}
time.Sleep(10 * time.Second)
close(quit)
wg.Wait()
}
所以这个解决方案有效,以适当的时间间隔同时执行所有的代码并在 10 秒后完成,但它实际上并没有退出程序,而是挂在最后的 wg.Wait() 行上。此外,每个并发函数调用都使用自己的代码 - 有什么方法可以让所有函数都可以使用一个“主”代码?
提前致谢!这是我第一次真正深入研究 Go 的并发性。
波斯汪
相关分类