如何轮询HTTP端点和更新数据源?



我正在尝试做一些需要更长的时间的CRUD操作。我已经提出了一个示例游乐场来演示我的问题:

package main
import (
"fmt"
"math/rand"
"time"
)
func call(s int) {
fmt.Println(s)
}
func get() int {
num := rand.Intn(20-10) + 5
return num
}
func main() {
call(1)
ticker := time.NewTicker(1000 * time.Millisecond)
stop := make(chan bool, 1)
check := make(chan string, 1)
go func() {
for {
select {
case <-stop:
check <- "done" 
fmt.Println("stopped")
return
case <-ticker.C:
randInt := get()
if randInt == 11 {
call(randInt)
stop <- true
} else {
call(randInt)
}
}
}
}()

//fmt.Println(<-stop)
}
  1. 是一个http请求
  2. 在请求结束时,我返回202 http,然后触发go例程。
  3. go例程的目的,检查所请求的实体是否比in progress
  4. 创建/删除/更新/失败
  5. 演示程序运行,直到它获得随机数11,即类似于在第3点获得所需状态之一。
  6. 我觉得有可能在相当长的一段时间里,随机数永远不会遇到11。(如果范围是100万)所以我想在10个func调用后取消报价器。

我该怎么做?

是正确的东西,即ticker, goroutine。请建议。

不幸的是,参考了几个论坛,帖子后我无法解码。更混淆context, timer和所有。

为了限制尝试次数,我们只需要计算尝试次数,这对于现有的for循环来说是微不足道的。

stop通道中,您似乎也打算使其可取消,但是这里的使用不会像预期的那样工作。您可以为此使用context.Context,稍后可以将其合并到接受上下文的其他调用中。否则,sync.WaitGroup是等待完成的方法。

等待程序返回可以通过通道完成,但不应该依赖于发送单个值。如您的示例所示,多个读取器(可能由于重构而在稍后添加)将导致另一个读取器无法接收信号。如果你使用频道,关闭频道是广播信号的规范方式。

使用这些信息,我们可以得出这个修改后的例子:https://play.golang.org/p/hZiRXtMm-SB

ctx, cancel := context.WithCancel(context.Background())
defer cancel()
maxAttempts := 5
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
ticker := time.NewTicker(1000 * time.Millisecond)
call(1)
for i := 1; ; i++ {
if i >= maxAttempts {
fmt.Println("too many tries")
return
}
select {
case <-ctx.Done():
fmt.Println("cancelled")
return
case <-ticker.C:
randInt := get()
call(randInt)
if randInt == 11 {
fmt.Println("OK")
return
}
}
}
}()
wg.Wait()

最新更新