讨论数量:
这是要看业务场景,而非怎么写怎么实现。是只使用 goroutine 还是 goroutine +chan 还是 goroutine +wait 都是根据业务场景来
如你所说的批量插入问题:如果 mongo 业务性能能支持 goroutine 大批量插入又不会造成大量 goroutine 堆积造成性能问题,业务也接受一定的丢失率,直接只使用 goroutine 就可以搞定。
看起来你应该是 1800 条数据一条一条插入的,这里的性能瓶颈应该是 1800 次调用 mongo 插入接口插入数据花费的时间,多起协程并不能加快 mongo 的运算,可以打印 1800 次循环每次花费的时间,就能清晰的知道时间耗费在哪里了。建议先把 1800 条数据构建好,然后调用 mongo 的批量插入数据接口一次性插入数据,能大幅度减少插入时间。
管道的作用类似一个缓冲区,可以在这个缓冲区内解决如:网络传输等耗时;协程是并行处理逻辑的方法。
我们比作一个流水线上,有 N 个工人在打包物品。
- 通过 N 个工人干活,这相当于是创建 N 个协程并行处理。
- 而流水线的长度(即可放置物品的容量)就有点管道长度的概念。
- 假设流水线的长度为 0,即:上个工艺直接干完就给当前工艺(即打包物品)线,如果当前工艺处理不过来,那就会阻塞上个工艺的处理速度,因为下一个还没干完;等当前处理好了,我就得【“等”】上个工艺干完了,出任务给我了。
- 当如果此时有个 X 长度的流水线(管道),可能上个工艺也会等下个流水线处理好,但因为流水线容量的问题,可保证当前工艺的处理事一直在干活(即不休息,绝对是资本家),也无需【等】上个工艺处理好,因为流水线上还有一堆活没干呢……
你的管道慢的问题,可能是流水线是有了,但工人不够……
推荐文章: