gin-gonic进程是否并行请求?

mle*_*s54 5 go go-gin

我们有一个基于gin-gonic编写的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/
Run Code Online (Sandbox Code Playgroud)

实时观看日志,直到第二个呼叫结束,才会显示最后3个条目。这五个调用在彼此之间的5毫秒内进行。我们希望这些呼叫应并行处理。这意味着所有呼叫应在17:24:40之前完成,而不是17:24:43。IE:建立连接以处理请求时,服务器会生成新的线程/ goroutine。如果不是这种情况,那么有人对以这种方式工作的软件包有任何建议吗?

这是我们第一个使用gin-gonic的项目,我想知道是否需要设置一些配置参数。任何想法/建议表示赞赏。

Joh*_*don 8

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

概念漫谈:

Go 有旨在提供强大并发能力的原语,但并发与并行不同。

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

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

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

  • 我完全理解 go 和 us go 例程中多个领域的并发和并行概念。我的问题与此无关。它询问 gin-gonic 是否以同步方式处理请求,还是异步方式(将其全部归结为)。我更多地寻求 gin-gonic 方面的帮助,而不是 go 方面的帮助。现在答案可能是我必须使用带有 gin-gonic 的 go 例程,但我对 gin-gonic 不够熟悉,不知道是否是这种情况。 (8认同)
  • gin-gonic 只是一个使用(快速)路由器的 Web 框架,但实际的 http 请求最终由 Go http.Server.Serve 函数处理 (3认同)
  • @sphoenix 我能够消除 GIN-GONIC 和 NET/HTTP 模块。他们确实是同时运行的。它似乎是前端代码中的某些内容正在调用发出 API 调用的 PHP 程序。不过时间已经过去很久了,有些细节我可能已经忘记了。 (2认同)