我有一个可以在单独的 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 传递给顺序函数调用?的详细内容。更多信息请关注PHP中文网其他相关文章!