登录
首页 >  Golang >  Go问答

如何在无限 for 循环中实现 goroutine; for{} 等待组完成后重试?

来源:stackoverflow

时间:2024-03-17 12:57:29 453浏览 收藏

在并发编程中,使用 goroutine 可以有效提高程序效率。本文将探讨如何在无限 for 循环中实现 goroutine,并利用等待组(wait group)在其中一个 goroutine 出现错误时触发重试逻辑。通过结合等待组和定时器,可以实现当所有 goroutine 完成或超时时,重新启动循环。这对于需要持续监控或执行任务的场景非常有用,例如网络流量监听和数据处理。

问题内容

我的场景是我想触发多个监听网络流量的 go 例程,如果其中一个 go 例程函数出现错误,函数将执行 wg.done() 并且这个 for 循环应该等待其他 go 例程执行 wg.done() 并在一段时间后,比如睡眠十分钟,这个 for 循环应该再次运行。这有点像重试逻辑。有人可以帮忙解决这个问题吗?谢谢。下面是我到目前为止想到的代码。

package main

import (
    "errors"
    "fmt"
    "sync"
)

func main() {

    var wg sync.WaitGroup
    for {
        wg.Add(1)
        go A(&wg)
        wg.Add(1)
        go B(&wg)

    }
    wg.Wait()

}

func A(wg *sync.WaitGroup) {

    fmt.Println("inside function A")

    err := errors.New("There is an error")
    if err != nil {
        wg.Done()
    }

}

func B(wg *sync.WaitGroup) {

    fmt.Println("Inside function B")

    err := errors.New("There is an error")
    if err != nil {
        wg.Done()
    }

}

解决方案


您的 wg.wait() 永远不会运行,因为它位于无限循环之外。

我猜您正在寻找类似的东西?

for {
    tC := time.After(10 * time.Minute) // start timer before workers
    
    wg.Add(1)
    go A(&wg)

    wg.Add(1)
    go B(&wg)

    wg.Wait() // waits for both A & B to complete - whether they succeed or not

    <-tC // wait for remainder of 10 minutes before retrying
}

Playground Example

上述的一个警告:如果 ab 需要超过 10 分钟才能完成,则计时器将触发,并且 <-tc 将不会等待 - 导致循环立即重新启动。

最后,如果您想确保 ab 的运行时间不超过 10 分钟,那么您的工作线程应该考虑利用 context 包。通过 context.withtimeout(...) 传递上下文,您可以确保一旦上下文取消(即超时),工作线程将退出。

好了,本文到此结束,带大家了解了《如何在无限 for 循环中实现 goroutine; for{} 等待组完成后重试?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>