如何将 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()

}

有没有更好的方法来实现这一目标?


蝴蝶刀刀
浏览 116回答 1
1回答

慕的地6264312

你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)// orwg.Add(1)launchFunc(wg, my_func)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go