【问题标题】:How to pass WaitGroup to a sequential function call?如何将 WaitGroup 传递给顺序函数调用?
【发布时间】:2022-11-18 19:24:12
【问题描述】:

我有一个可以在单独的 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()
}

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

【问题讨论】:

    标签: go concurrency


    【解决方案1】:

    您的my_func() 不应该知道/不应该关心它是如何执行的(无论是否在新的 goroutine 中)。因此,就此而言,您不应该通过wg。不要强制并发或非并发使用你的 API,让你的包的用户决定他们希望如何调用它。

    如果有人希望并发运行它,在一个新的 goroutine 中,可以处理wg外部my_func() 像这样:

    wg.Add(1)
    go func() {
        defer wg.Done()
        my_func()
    }()
    

    这也提供了在函数调用之前/之后放置更多代码的可能性:

    wg.Add(1)
    go func() {
        defer wg.Done()
    
        // other code before
        my_func()
        // other code after
    }()
    

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2020-01-01
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多