我们有一个基于gin-gonic写的go服务器。我们注意到一些奇怪的东西让我们相信它是连续处理请求而不是预期的并行操作。考虑这个日志文件:
[GIN] 2016/04/05 - 17:24:37 | 200 | 5.738742ms | 64.... | POST /api/v2/d/
[GIN] 2016/04/05 - 17:24:40 | 200 | 3.262816256s | 64.... | POST /api/v2/d/
[GIN] 2016/04/05 - 17:24:42 | 200 | 3.563779ms | 64.... | POST /api/v2/d/
[GIN] 2016/04/05 - 17:24:43 | 200 | 105.429µs | 64.... | POST /api/v2/d/
[GIN] 2016/04/05 - 17:24:43 | 200 | 808.824µs | 64.... | POST /api/v2/d/
实时查看日志,直到第二个呼叫完成后才会显示最后3个条目。这五个调用是在相隔5毫秒的时间内对API进行的。我们希望调用应该并行处理。这意味着所有的呼叫应该在17:24:40而不是17:24:43完成。 IE:当建立连接以处理请求时,服务器产生新的线程/ goroutine。如果不是这样的话,那么任何人都有任何关于以这种方式工作的包的建议。
这是我们第一个使用gin-gonic的项目,我想知道是否需要设置一些配置参数。任何想法/建议都表示赞赏。
答案 0 :(得分:3)
回答你的根本问题;在初始连接接受和某些连接工作之后,stdlib http.Serve
(doc)func将请求存储到goroutine。
Go具有旨在提供强大并发功能的原语,但并发性与并行性不同。
如果您有多个处理器核心,并且您的GOMAXPROCS环境设置为大于1,那么除了并发之外,您可能会看到一些并行性,假设适当的goroutines。
从Go 1.5开始,GOMAXPROCS的默认设置是CPU核心数。 Go的早期版本默认GOMAXPROCS设置为1.
威廉·肯尼迪(William Kennedy)几年前对这些差异做了很好的写作:http://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html