问题内容 我有一个可以在单独的 Goroutine 中顺序或并发调用的函数。 我想确保函数在主 goroutine 完成之前完全执行,因此我将 *sync.waitgroup 参数传递
我有一个可以在单独的 Goroutine 中顺序或并发调用的函数。
我想确保函数在主 goroutine 完成之前完全执行,因此我将 *sync.waitgroup 参数传递给函数。现在,在某些地方该函数将被顺序调用。
我可以将 nil waitgroup 传递给函数,如下所示:
func my_func(wg *sync.WaitGroup){
if wg != nil{
defer wg.Done()
}
// do the task
}
func main(){
my_func(nil) // sequential call
wg := sync.WaitGroup{}
wg.Add(1)
go my_func(&wg) // concurrent call
wg.Wait()
}
有没有更好的方法来实现这个目标?
你的 my_func()
不应该知道/不应该关心它是如何执行的(无论是否在新的 goroutine 中)。因此,为此您不应该传递 wg
。不要强制并发或非并发使用您的 api,让您的包的用户决定他们希望如何调用它。
如果有人希望同时运行它,在一个新的 goroutine 中,可以在 my_func()
的外部处理 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 启动和 waitgroup 处理:
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)
以上就是如何将 WaitGroup 传递给顺序函数调用?的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 如何将 WaitGroup 传递给顺序函数调用?
本文链接: https://lsjlt.com/news/561214.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0