package main
import (
"log"
"net"
"net/http"
"sync"
)
func main() {
// 创建一个WaitGroup对象,用于记录并发请求的数量
var wg sync.WaitGroup
// 创建一个Mutex对象,用于保证并发安全
var mu sync.Mutex
// 定义HTTP请求处理函数
handler := func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/index" && r.Method == "GET" {
// 加锁,确保并发安全
mu.Lock()
// 如果并发请求的数量已经超过限制,返回错误码
if wg.Len() >= 500 {
http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
// 解锁,释放锁资源
mu.Unlock()
return
}
// 增加并发请求数量
wg.Add(1)
// 解锁,释放锁资源
mu.Unlock()
defer wg.Done()
}
// 正常处理请求
w.Write([]byte("Hello, world!"))
}
// 创建一个HTTP服务器,监听在localhost:8080地址上
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
defer listener.Close()
server := http.Server{
Handler: http.HandlerFunc(handler),
}
// 启动HTTP服务器
err = server.Serve(listener)
if err != nil {
log.Fatal(err)
}
}
这就没啥讲的, /index get 接口的请求并发最大500个超出即返回, 每个氢气处理完成,会进行回收