1 回答
TA贡献1817条经验 获得超6个赞
你my_func()不应该知道/不应该关心它是如何执行的(无论是否在新的 goroutine 中)。所以就为了这个你不应该通过wg。不要强制并发或非并发使用你的 API,让你的包的用户决定他们希望如何调用它。
如果有人希望同时运行它,在一个新的 goroutine 中,wg可以这样处理my_func():
wg.Add(1)
go func() {
defer wg.Done()
my_func()
}()
这也提供了在将在调用之前执行的函数调用之前/之后放置更多代码的可能性wg.Done():
wg.Add(1)
go func() {
defer wg.Done()
// other code before
my_func()
// other code after
}()
还要注意,如果你在很多地方都有这个,你可以创建一个辅助函数来处理 goroutine 启动和等待组处理:
func launchMyFunc(wg *sync.WaitGroup) {
go func() {
defer wg.Done()
my_func()
}()
}
您还可以创建一个接受任意无参数不返回函数的助手:
func launchFunc(wg *sync.WaitGroup, f func()) {
go func() {
defer wg.Done()
f()
}()
}
使用上面的助手,你可以这样做:
wg.Add(1)
launchMyFunc(wg)
// or
wg.Add(1)
launchFunc(wg, my_func)
- 1 回答
- 0 关注
- 68 浏览
添加回答
举报