Home >Backend Development >Golang >How to pass WaitGroup to sequential function call?

How to pass WaitGroup to sequential function call?

王林
王林forward
2024-02-05 22:57:191057browse

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

Question content

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?


Correct answer


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

wg.done()

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete
Previous article:Create type from sliceNext article:Create type from slice