http - 是否可以限制每秒运行多少个 goroutines?

标签 http go

我有一个 URL 列表,我需要使用 goroutine 来同时触发 HTTP 请求。无论如何检查和限制每秒发送多少 HTTP 请求?

最佳答案

Go 中的一个非常简单的版本是对 Leaky Bucket 的改编。算法,使用 channel 和协程。在发出请求之前从 rate channel 接收 token 将检查速率并在速率限制器为空时阻止。

// create a buffered channel.
// The capacity of the channel is maximum burst that can be made.
rate := make(chan struct{}, 10)

go func() {
    ticker := time.NewTicker(100 * time.Millisecond)
    for range ticker.C {
        rate <- struct{}{}
    }
}()

由于一系列耗时超过平均速率的请求最终会并发,因此您可能也需要限制并发。您可以添加第二个 channel 作为信号量,在发出请求之前向信号量添加 token ,并在请求完成后将其删除。

// limit concurrency to 5
semaphore := make(chan struct{}, 5)

// in request function
semaphore <- struct{}{}
defer func() {
    <-semaphore
}()

这里有一个更完整的例子:

https://play.golang.org/p/ZrTPLcdeDF

关于http - 是否可以限制每秒运行多少个 goroutines?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43789362/

相关文章:

java - 文本未保存到字符串变量

python - Python 中真正的非阻塞 HTTPS 服务器

c++ - 传递多个参数 HttpPostRequest c++

django - 服务器响应终端行分析。响应行的最后一部分是什么?

json - 如何解码json数据 Go

python-2.7 - 如何使用 Tornado 发送 HTTP 广播消息?

image - go 中的 WebP 编码器/解码器

go - 如何使用 Gorilla Mux 将整个路径与正则表达式匹配

go - 切换语句以将特定变量添加到api请求

garbage-collection - 如何最小化 Go 中的垃圾收集?