我想问一下 golang 的协程开销到底会不会很大?
比如我开了 1W 个 go routine 并发解析 json,会不会比 for 循环连续解析 1W 个更慢,因为协程虽然轻量,但是创建还是需要时间和内存?
那如果是 10W 、100W 甚至更多呢?
或者说,这种情况下怎么做最合适?
1
maemual 2020-08-24 16:48:48 +08:00
解析 JSON 吃 CPU,你到 CPU 核数基本就能吃满主机 CPU 了,再往上加就白白增加 goroutine 的调度成本了吧
|
2
PiersSoCool OP @maemual 所以说还是有个度,超过这个度 goroutine 是低效的。
|
3
linvon 2020-08-24 21:04:09 +08:00
你的 json 来源呢?如果是从网络或者文件读取那 goroutine 肯定效率提升很大啊。但如果都在内存里,那完全就是 CPU 密集操作,你开 goroutine 就是负优化
|
4
PiersSoCool OP @linvon 读的是 Redis 队列的数据,一次读 2000 条放入内存里,之后处理。也不是完全负优化,因为我开了 2000 个 goroutine 确实比顺序执行跑的快得多。但调优的时候发现 2000 条 ~ 3000 条的时候,速度就不提升了,这时候可能是负优化了。
|
5
linvon 2020-08-25 10:17:36 +08:00
@PiersSoCool #4 涉及到 io 操作那用 goroutine 肯定有提升,速度不在一个量级上。2000 条在内存实际上很少,执行完全部数据用不了一秒。开 goroutine 本身也有开销的,当异步 IO 带来的提升已经被足够的 goroutine 利用完后,你再开就没什么作用了
|