go 批量插入问题咨询

1. 运行环境

2. 问题描述?

初学者提问请教大家,go ,在for循环中,使用协程goroutine ,直接插入数据到mongo,测试1800条数据要6秒左右时间,如果通过信道需要12秒左右时间,正常吗,什么情况下更适合使用信道?你们一般怎么写入啊?有没有更好的方式?机子4核 8G 256 系统os

讨论数量: 12

你用goroutine 不是也要chan 来配合吗? 6秒左右的是 goroutine + waitgroup?

3周前 评论
Tangqy (楼主) 3周前
yzbfeng (作者) 2周前

老哥 是不是迷路啦 这里是php

3周前 评论
保安

贴代码

3周前 评论
保安

加channel 肯定比直接goroutine慢啊

3周前 评论

协程,你想把你的mongo干死?

3周前 评论
Tangqy (楼主) 3周前

这是要看业务场景,而非怎么写怎么实现。是只使用 goroutine 还是 goroutine +chan 还是 goroutine +wait 都是根据业务场景来

如你所说的批量插入问题:如果 mongo 业务性能能支持 goroutine 大批量插入又不会造成大量 goroutine 堆积造成性能问题,业务也接受一定的丢失率,直接只使用 goroutine 就可以搞定。

2周前 评论
cswyp

看起来你应该是1800条数据一条一条插入的,这里的性能瓶颈应该是1800次调用mongo插入接口插入数据花费的时间,多起协程并不能加快mongo的运算,可以打印1800次循环每次花费的时间,就能清晰的知道时间耗费在哪里了。建议先把1800条数据构建好,然后调用mongo的批量插入数据接口一次性插入数据,能大幅度减少插入时间。

1周前 评论
flc1125

管道的作用类似一个缓冲区,可以在这个缓冲区内解决如:网络传输等耗时;协程是并行处理逻辑的方法。

我们比作一个流水线上,有N个工人在打包物品。

  • 通过N个工人干活,这相当于是创建N个协程并行处理。
  • 而流水线的长度(即可放置物品的容量)就有点管道长度的概念。
    • 假设流水线的长度为0,即:上个工艺直接干完就给当前工艺(即打包物品)线,如果当前工艺处理不过来,那就会阻塞上个工艺的处理速度,因为下一个还没干完;等当前处理好了,我就得【“等”】上个工艺干完了,出任务给我了。
    • 当如果此时有个X长度的流水线(管道),可能上个工艺也会等下个流水线处理好,但因为流水线容量的问题,可保证当前工艺的处理事一直在干活(即不休息,绝对是资本家),也无需【等】上个工艺处理好,因为流水线上还有一堆活没干呢……

你的管道慢的问题,可能是流水线是有了,但工人不够……

1周前 评论

批量插入,你这个是一条条插入的吧,1800条怎么可能这么慢

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!