问答 / 1 / 12 / 创建于 2年前 / 更新于 2年前 / 1 个改进
初学者提问请教大家,go ,在for循环中,使用协程goroutine ,直接插入数据到mongo,测试1800条数据要6秒左右时间,如果通过信道需要12秒左右时间,正常吗,什么情况下更适合使用信道?你们一般怎么写入啊?有没有更好的方式?机子4核 8G 256 系统os
你用goroutine 不是也要chan 来配合吗? 6秒左右的是 goroutine + waitgroup?
老哥 是不是迷路啦 这里是php
贴代码
加channel 肯定比直接goroutine慢啊
协程,你想把你的mongo干死?
这是要看业务场景,而非怎么写怎么实现。是只使用 goroutine 还是 goroutine +chan 还是 goroutine +wait 都是根据业务场景来
如你所说的批量插入问题:如果 mongo 业务性能能支持 goroutine 大批量插入又不会造成大量 goroutine 堆积造成性能问题,业务也接受一定的丢失率,直接只使用 goroutine 就可以搞定。
看起来你应该是1800条数据一条一条插入的,这里的性能瓶颈应该是1800次调用mongo插入接口插入数据花费的时间,多起协程并不能加快mongo的运算,可以打印1800次循环每次花费的时间,就能清晰的知道时间耗费在哪里了。建议先把1800条数据构建好,然后调用mongo的批量插入数据接口一次性插入数据,能大幅度减少插入时间。
管道的作用类似一个缓冲区,可以在这个缓冲区内解决如:网络传输等耗时;协程是并行处理逻辑的方法。
我们比作一个流水线上,有N个工人在打包物品。
你的管道慢的问题,可能是流水线是有了,但工人不够……
批量插入,你这个是一条条插入的吧,1800条怎么可能这么慢
我要举报该,理由是:
你用goroutine 不是也要chan 来配合吗? 6秒左右的是 goroutine + waitgroup?
老哥 是不是迷路啦 这里是php
贴代码
加channel 肯定比直接goroutine慢啊
协程,你想把你的mongo干死?
这是要看业务场景,而非怎么写怎么实现。是只使用 goroutine 还是 goroutine +chan 还是 goroutine +wait 都是根据业务场景来
如你所说的批量插入问题:如果 mongo 业务性能能支持 goroutine 大批量插入又不会造成大量 goroutine 堆积造成性能问题,业务也接受一定的丢失率,直接只使用 goroutine 就可以搞定。
看起来你应该是1800条数据一条一条插入的,这里的性能瓶颈应该是1800次调用mongo插入接口插入数据花费的时间,多起协程并不能加快mongo的运算,可以打印1800次循环每次花费的时间,就能清晰的知道时间耗费在哪里了。建议先把1800条数据构建好,然后调用mongo的批量插入数据接口一次性插入数据,能大幅度减少插入时间。
管道的作用类似一个缓冲区,可以在这个缓冲区内解决如:网络传输等耗时;协程是并行处理逻辑的方法。
我们比作一个流水线上,有N个工人在打包物品。
你的管道慢的问题,可能是流水线是有了,但工人不够……
批量插入,你这个是一条条插入的吧,1800条怎么可能这么慢