gpt4 book ai didi

go - 如何在无限 for 循环中实现 goroutine; for{} 在 WaitGroup 完成后重试?

转载 作者:行者123 更新时间:2023-12-01 22:11:08 25 4
gpt4 key购买 nike

我的场景是我想触发多个监听网络流量的 goroutine,如果其中一个 goroutine 函数出错,函数将执行 wg.done() 并且这个 for 循环应该等待其他 goroutine 执行 wg .done() 并在一段时间后,比如十分钟的 sleep ,这个 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
上面的一个警告:如果 A & B需要超过 10 分钟才能完成,然后计时器触发并 <-tC不会等待 - 导致循环立即重新启动。

最后,如果要确保 AB运行时间不要超过 10 分钟,那么你的工作 goroutine 应该考虑利用 context包裹。通过例如 context.WithTimeout(...) 传递上下文,您可以确保一旦上下文取消(即超时),工作人员将退出。

关于go - 如何在无限 for 循环中实现 goroutine; for{} 在 WaitGroup 完成后重试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63607970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com