杜松子酒是否并行处理请求



我们有一个基于gin-gonic的用go编写的API服务器。我们注意到一些奇怪的事情,这让我们相信它是串行处理请求,而不是预期的并行操作。请考虑以下日志文件:

[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的第一个项目,我想知道是否有一些配置参数需要设置。欢迎提出任何想法/建议。

回答您的根本问题;stdlib http.Serve(doc)函数在初始连接接受和一些连接工作之后将请求发送到goroutine。

概念漫步:

Go的基元被设计为提供强大的并发能力,但并发与并行不同。

如果您有多个处理器核心,并且GOMAXPROCS环境设置为大于1,那么您可能会看到除了并发之外的一些并行性,假设有适当的goroutines。

从Go 1.5开始,GOMAXPROCS的默认设置是CPU核数。早期版本的Go将GOMAXPROCS设置默认为1。

几年前,威廉·肯尼迪对这些差异写了一篇很好的文章:http://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html

最新更新