gpt4 book ai didi

for-loop - 暂停for循环的执行

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:07 26 4
gpt4 key购买 nike

我有一个 API,我也在发布一个小的 JSON 对象。

这作为一个无限循环运行,循环 7 种颜色(彩虹)并将它们发送到上述 JSON 对象中。

我正在连接的 API 的速率限制为每分钟 40 个请求。

我不想达到速率限制,所以我设计了一种方法来避免这种情况;

  • 我有一个全局变量,用于存储允许我发出的请求数
  • 我有一个函数,它保存一个代码集,每 60 秒运行一次,并填充存储我的请求的全局变量
  • 然后我有一个永无止境的 for 循环,它运行并检查仍然允许发出的请求数,如果它大于 0,那么我们发出下一个请求,如果不是,那么我们就休眠一秒钟再试一次

看起来有点像这样:

var rateLimit int

func main() {

request := gorequest.New().SetDebug(false)

// Set the initial request bucket to 40
rateLimit = 40

go topUpLimiter()

for {
makeTheLightsBlinkTheRainbow(request)
}
}

func topUpLimiter() {
for range time.Tick(60 * time.Second) {
rateLimit += 40
}
}

func makeTheLightsBlinkTheRainbow(request *gorequest.SuperAgent) {
colours := [7]string{"red", "orange", "yellow", "green", "blue", "purple", "pink"}

for _, colour := range colours {

if rateLimit > 0 {

response, _, _ := request.Post("http://example.com/blink").
Send(fmt.Sprintf(`{"color":"%v"}`, colour)).
End()

rateLimit--

} else {
time.Sleep(1 * time.Second)
}
}
}

这行得通,我从来没有达到速率限制,但是一旦我用完请求,循环就会继续运行,并且只会在 rateLimit 变量达到顶峰时再次开始发出请求.

我正在让 IoT 灯闪烁彩虹的颜色,结果是一旦 rateLimit 变量用完颜色就会乱序,然后由于以下事实而被补足for 循环一直在运行。

我想在等待 rateLimit 变量补充时暂停/阻止 for 循环,这样颜色就不会乱序。

我将如何实现类似的东西?从我的搜索来看, channel 似乎是可行的,但我不太确定如何做到这一点。

这是一个最终发生的例子:https://play.golang.org/p/r6OG4kK9vCP一旦它完成运行,您会注意到打印出来的颜色大约在中途出现乱序。

最佳答案

我的建议:采用完全不同的方法来限制速率。

我会把它放在 HTTP 传输中,因为从逻辑上讲,这是应该存在这种限制的地方,然后您根本不需要破坏您的应用程序代码。像这样的东西:

import (
"net/http"

"golang.org/x/time/rate"
)

type rateLimitTransport struct {
limiter *rate.Limiter
xport http.RoundTripper
}

var _ http.RoundTripper = &rateLimitTransport{}

func newRateLimitTransport(r float64, xport http.RoundTripper) http.RoundTripper {
return &rateLimitTransport{
limiter: rate.NewLimiter(rate.Limit(r), 1),
xport: xport,
}
}

func (t *rateLimitTransport) RoundTrip(r *http.Request) (*http.Response, error) {
t.limiter.Wait(r.Context())
return t.xport.RoundTrip(r)
}

这使用 golang.org/x/time/rate 包来实现速率限制。 newRateLimitTransport() 创建一个新的速率限制传输,其中 r 是每秒允许的最大请求数。

要利用这一点,请在后端 API 的 HTTP 客户端中使用限速传输实例:

// set this in `init()` for example
myClient := http.&Client{
// Use a rate-limiting transport which falls back to the default
Transport: newRateLimitTransport(60, http.DefaultTransport)
}

// Then later use `myClient` instead of the default, when making API
// requests:
req, err := http.NewRequest(http.MethodPost, url, body)
if err != nil {
return err
}
myClient.Do(req)

关于for-loop - 暂停for循环的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48729167/

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