func xHandle(w http.ResponseWriter, r *http.Request) {
fmt.Printf("new request: %p\n", r)
w.Write([]byte("Hello\n"))
for {}
}
func main() {
http.HandleFunc("/", xHandle)
http.ListenAndServe(":8080", nil)
}
对于每一个http请求,http服务都会启动一个go routine 来调用xHandle函数。目前搜到的资料都是在xHandle内部做并发数控制,就是说等http服务启go routine后,发现超限了再直接退出。
我想问的是如何从源头上控制http服务的go routine数量,也是当go routine到达上限后,都不用启动go routine回调xHandle,直接在底层响应500给客户端?
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)
@GGXXLL 感谢指点,我没有描述清我的问题。我看了下源码,我的需求该是无解的。我想要的效果在资源超限时阻止创建go routine,也就是下面代码最后一行不要执行:
go c.serve(connCtx)
。现在看来就是来了一个请求,只能先执行这行代码创建go routine,进入limit-handler,然后再退出了。
@GGXXLL 感谢指点,我没有描述清我的问题。我看了下源码,我的需求该是无解的。我想要的效果在资源超限时阻止创建go routine,也就是下面代码最后一行不要执行:
go c.serve(connCtx)
。现在看来就是来了一个请求,只能先执行这行代码创建go routine,进入limit-handler,然后再退出了。
@leenzhu 确实。实际上即使起了 goroutine 调用 handle 了,也直接返回了,开销很小,所以不太懂为啥要限制这个呀。
可以用一个定长的channel配合select实现吧
假设我的limit-handler没写好,不能正常退出或者处理速度过慢,那么当请求快速源源不断到来时,就有可能导致系统内有无数个go-routine。如果不能即时消化这些go-routine可能就会导致内存爆掉了。
不过如果limit-handler写得足够健壮,这个担心应该是多余的![:smile: :smile:](https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/images/basic/smile.png)
fasthttt的话,可以设置 Concurrency
fasthttp的话,可以设置 Concurrency
楼主的那个效果只能改源码
channel 应该可以实现,在goroutine启动之前从定长的channel里取值,取到就会继续执行,没取到就会阻塞,需要限制多少并发,就建多大的goroutine