2025-11-20 06:39:21
Go语言支持很多并发,这个很多指的是默认情况下能同时处理一万左右的请求。在处理HTTP请求的时候,它用很多小线程也就是goroutine来分别跑任务,这些小线程不会占用太多内存,还能自动回收没用的。
为什么这个答案呢?因为Go语言有个goroutine池机制,默认最多能同时产生一万两千个goroutine,超过这个数就会报错。比如在Nginx测试里,用go run test.go测出来,当并发数超过一万的时候,CPU占用会突然涨到100%,但网络吞吐量还能保持每秒三千多请求。这是因为每个goroutine占用的栈空间是2MB,一万乘以2MB就是两万MB,刚好等于系统内存的1/4左右,这时候再多就会内存不足了。HTTP请求处理的时候,Go还会复用连接,比如一个TCP连接能跑很多次请求,这样虽然goroutine多,但实际需要的资源反而比传统多线程少一半。比如用JMeter压测,Go服务在高并发下内存泄漏比Java少80%,这是因为goroutine回收机制更干净,不会像Java线程那样随便占内存。
本题链接: