为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 WaitGroup 传递给顺序函数调用?

如何将 WaitGroup 传递给顺序函数调用?

Go
蝴蝶刀刀 2023-03-15 15:28:56
我有一个可以在单独的 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 callwg := sync.WaitGroup{}wg.Add(1)go my_func(&wg)  // concurrent callwg.Wait()}有没有更好的方法来实现这一目标?
查看完整描述

1 回答

?
慕的地6264312

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)


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信