go 批量插入问题咨询

1. 运行环境

2. 问题描述?

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

讨论数量: 12
cswyp

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

1年前 评论

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

1年前 评论
Tangqy (楼主) 1年前
yzbfeng (作者) 1年前

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

1年前 评论

贴代码

1年前 评论

加channel 肯定比直接goroutine慢啊

1年前 评论

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

1年前 评论
Tangqy (楼主) 1年前

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

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

1年前 评论
flc1125

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

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

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

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

1年前 评论

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

1年前 评论

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