【问题标题】:Does gin-gonic process requests in parallel?gin-gonic 是否并行处理请求?
【发布时间】:2016-07-25 20:45:01
【问题描述】:

我们有一个基于 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 的项目,我想知道是否需要设置一些配置参数。感谢您提出任何想法/建议。

【问题讨论】:

  • 你使用的是什么版本的 Go?
  • @JohnWeldon 我正在使用 1.6
  • 因此,假设您有多个逻辑 CPU,您可能可能会看到并行性,但不能保证。 Goroutines 提供并发性,不一定是并行性。

标签: go go-gin


【解决方案1】:

回答你的根本问题; stdlib http.Serve (doc) func 在初始连接接受和一些连接工作后将请求发送到 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 中的并发和并行的概念,并且我们在许多领域的 go 例程。我的问题与此无关。它询问 gin-gonic 是否以同步方式处理请求,或者它是异步的(将其全部归结)。我正在寻找更多关于 gin-gonic 的帮助,而不是 go。现在答案可能是我必须使用 gin-gonic 的 go 例程,但我对 gin-gonic 不够熟悉,不知道是不是这样。
  • gin-gonic 只是一个使用(快速)路由器的 Web 框架,但实际的 http 请求最终由 Go http.Server.Serve 函数处理
  • 因此,根据您对根本问题的回答,实际上似乎可以同时处理多个请求(直到我们用完核心)。所以我回到令人费解的问题:为什么连接似乎是按顺序执行的?我仔细检查以确保没有在任何地方设置 GOMAXPROCS。它不是(反正我)。我从 1.6 全新安装开始,因此没有遗留代码。我被困住了。
  • @elithrar 感谢您的意见。我有一个 go 程序,它启动 5 个请求作为 go 例程(来自另一台服务器)。正是在查看日志时,我看到了奇怪的时机,并且在结果返回给调用者时似乎承受住了。有一个“胖”调用需要 1.5 - 4 秒才能运行,而其他一些调用似乎在它们后面堆积。然后我在 Javascript 中尝试了帖子和回调。同样的行为。
  • @elithrar 好的,我想我会写一个快速的 net/http 服务器,看看是否会出现相同的行为。使用 gin-gonic,服务器上的调用者和记录器同意调用不会同时发生。
猜你喜欢
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2015-09-04
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多