Home >Backend Development >Golang >How to pass WaitGroup to sequential function call?
I have a function that can be called sequentially or concurrently in separate goroutines.
I want to ensure that the function is fully executed before the main goroutine completes, so I pass the *sync.waitgroup parameter to the function. Now, in some places the function will be called sequentially.
I can pass nil waitgroup to the function like this:
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() }
Is there a better way to achieve this goal?
Your my_func()
should not know/should not care how it is executed (whether in a new goroutine or not middle). Therefore, you should not pass wg
for this. Don't force concurrent or non-concurrent use of your api, let users of your package decide how they want to call it.
If anyone wishes to run it simultaneously, in a new goroutine, this can be done outside
of my_func() as shown below :
<pre class="brush:php;toolbar:false;">wg.add(1)
go func() {
defer wg.done()
my_func()
}()</pre>
This also makes it possible to place more code before/after function calls that will be executed before the
call:
<pre class="brush:php;toolbar:false;">wg.add(1)
go func() {
defer wg.done()
// other code before
my_func()
// other code after
}()</pre>
Also note that if you have this functionality in many places, you can create a helper function that takes care of goroutine startup and waitgroup handling:
func launchmyfunc(wg *sync.waitgroup) { go func() { defer wg.done() my_func() }() }
You can also create a helper that accepts any parameterless and returnless function:
func launchfunc(wg *sync.waitgroup, f func()) { go func() { defer wg.done() f() }() }
Using the helpers above, you can do this:
wg.Add(1) launchMyFunc(wg) // or wg.Add(1) launchFunc(wg, my_func)
The above is the detailed content of How to pass WaitGroup to sequential function call?. For more information, please follow other related articles on the PHP Chinese website!