gpt4 book ai didi

go - 如何限制与 Go API 的并发连接

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

我正在启动一个带有 listenandserve 的 Go API 来接受 HTTP 请求。

我怎样才能实现以下目标?

  1. 允许最多 100 个并发 HTTP 请求
  2. 第 101 个请求(以及任何其他请求)应等待 10 分钟以尝试落入此“100 个同时”限制(即希望前 100 个请求中的一些请求应该完成)
  3. 如果 10 分钟过去了并且没有可用的请求“插槽”打开,则为一直在等待的请求返回错误
  4. 接下来运行的请求 101...102...x 的顺序并不重要

当前版本完全不可用:

    timeout := time.After(10 * time.Minute)
tick := time.Tick(15 * time.Second)
fullcmdfirst := fmt.Sprintf("netstat -anp | grep procname | grep ESTABLISHED | grep -v grep | wc -l")
outputfirst, err1first := exec.Command("/bin/sh", "-c", fullcmdfirst).CombinedOutput()
if strconv.ParseFloat(string(outputfirst)) < 100 {
return nil
}

// Keep trying until we're timed out or lock acquired
for {
select {
// Got a timeout! fail with a timeout error
case <-timeout:
return errors.New("Error: timed out ")
// Got a tick, we should check if we can acquire
case <-tick:
fullcmd := fmt.Sprintf("netstat -anp | grep procname | grep ESTABLISHED | grep -v grep | wc -l")
output, err1 := exec.Command("/bin/sh", "-c", fullcmd).CombinedOutput()
if strconv.ParseFloat(string(outputfirst)) < 100 {
l.Printf("start req")
return nil
}
}
}

最佳答案

不需要 netstats 或 tickers 或其中任何一个(无论如何它都不会工作 - 一旦 netstat 看到 <100 个连接,没有任何东西会阻止所有通知的下一个 100 个请求,你最终运行 199 个请求一次;此外,等待处理的请求仍会出现在 netstat 中 - 限制连接完全是一个不同的问题)。只需使用缓冲 channel 作为信号量;它已经是线程安全的。

sem := make(chan struct{}, 100)

func myHandler(w http.ResponseWriter, r *http.Request) {
timeout := time.After(10 * time.Minute)
select {
case <- timeout:
http.Error(w, "Sorry", http.StatusUnavailable)
return
case sem <- struct{}:
w.Write([]byte("Hello"))
<- sem
return
}
}

请注意,大多数客户端在 10 分钟标记之前很久就已经超时了。

关于go - 如何限制与 Go API 的并发连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964347/

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