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

How to pass WaitGroup to sequential function call?

王林
Release: 2024-02-05 22:57:19
forward
1077 people have browsed it

如何将 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()
}
Copy after login

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 : <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">wg.add(1) go func() { defer wg.done() my_func() }()</pre><div class="contentsignin">Copy after login</div></div> This also makes it possible to place more code before/after function calls that will be executed before the

wg.done()

call: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">wg.add(1) go func() { defer wg.done() // other code before my_func() // other code after }()</pre><div class="contentsignin">Copy after login</div></div> 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()
    }()
}
Copy after login

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()
    }()
}
Copy after login

Using the helpers above, you can do this:

wg.Add(1)
launchMyFunc(wg)

// or
wg.Add(1)
launchFunc(wg, my_func)
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template