大家在写服务端 go 代码的时候,是喜欢一个请求一个 goroutine 到底,还是喜欢在一个请求处理 goroutine 里再开其他的 goroutine 呢?

2019-12-05 16:36:58 +08:00
 Mithrandir
如果是后一种情况,那么一般在什么地方开新的 goroutine 呢?如果能说一下原因最好了。
3984 次点击
所在节点    Go 编程语言
11 条回复
simapple
2019-12-05 17:08:22 +08:00
在需要等待 io 的地方 最小化 一个 goroutine
BlackBerry999
2019-12-05 17:08:28 +08:00
要看实际情况,如某些请求对响应时间有要求,但是有部分业务处理耗时较长,此部分会用协程异步处理。
总结一下:按需处理。
Mithrandir
2019-12-05 17:57:13 +08:00
@BlackBerry999 @simapple 我理解 goroutine 本来就不会因为自身的在处理 IO 操作而导致其他 gorutine 等待,那么这种情况开新 goroutine 有啥意义呢。
Mithrandir
2019-12-05 17:59:33 +08:00
如果是非 IO 操作导致该 goroutine 处理时间过长,这种情况新开 goroutine 也没用啊,该占用的 CPU 时间还是要占用。
yuankui
2019-12-05 18:05:24 +08:00
一杆子,捅到底
Heebe
2019-12-05 18:14:08 +08:00
我喜欢丰满的,他喜欢瘦的。不过我们都追求一个原则,必须是女的!
任何模式都是基于业务而设计。
22too
2019-12-05 18:18:31 +08:00
基于业务,理论上你都在当前开启了一个 goruntine 了. 那就你认为内部的东西是可以异步的. 具体这个异步里面要不要再写 goruntine ,还是要看你的业务能不能 异步, 如果只能同步操作,就不要开启. 如果能异步那就开启 goruntine.

如楼上说的, 基于业务
Mithrandir
2019-12-05 18:21:55 +08:00
@22too 嗯,有道理
gamexg
2019-12-05 18:38:13 +08:00
一般是一个 goruntine 到底,
因为虽然 goruntine、chan 成本低,但是也是有成本,没必要多开一个浪费资源。

但是一些特殊情况下会单独开个 goruntine ,
例如客户一个连接发出多个请求,其中部分请求类型依赖外部服务并且可能高耗时。
在客户端可以接受乱序回应的情况下,会使用新 goruntine 处理,根据不用情况,可能考虑提供线程池等方式处理请求。
index90
2019-12-05 18:56:03 +08:00
给 blog 开发一个接口,根据文章 id,查询文章内容及评论。
初级后端开发:根据 id 查询文章内容,根据 id 查询评论
传统后端开发:根据 id 组成 join 查询语句,把查询丢给 db 处理
现代后端开发:根据 id 同时查询文章内容和评论,组合并返回
almas1992
2019-12-06 16:31:34 +08:00
@yuankui 绝逼是 PHP 转的 O(∩_∩)O 哈哈~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/626249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX