go - gin-gonic 是否并行处理请求?

标签 go go-gin

我们有一个基于 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 次调用是在 5 毫秒内对 API 进行的。我们希望调用应该并行处理。这意味着所有调用都应在 17:24:40 之前完成,而不是 17:24:43。 IE:当建立连接以处理请求时,服务器会生成一个新的线程/goroutine。如果不是这种情况,是否有人对以这种方式工作的软件包有任何建议。

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

最佳答案

回答你的根本问题;标准库 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

关于go - gin-gonic 是否并行处理请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36434332/

相关文章:

go - 不属于接口(interface)类型的通用类型

arrays - 创建一个没有 make 的 Go slice

go - 如何访问 Structs 内部的 map ?不能获取 g.vertexes[base] 的地址

go - 在数据库 golang 中保存发布数据(具有整数和字符串值)的正确方法是什么?

go - Gin 框架无法从 Postman 获取数据

go - 从本地子目录导入包

dictionary - 这个并发映射有什么问题?

arrays - 如何在 Go 语言中创建多维键值数组/slice

go - 如何使用虚拟属性

templates - 在 golang gin 简单模板示例中,如何呈现不带引号的字符串?