go 用 mgo 并发操作死锁

2017-01-10 14:40:14 +08:00
 sujin190
go 语言的 mongodb drive mgo 不是说线程安全的么?多个协成一并发一下就死锁了啊,有人用过这个么?
2414 次点击
所在节点    Go 编程语言
22 条回复
njutree
2017-01-11 16:14:01 +08:00
根据我的理解这个不是死锁,是卡住了。 mgo.Session 会起一个协程运行 readLoop() 读取数据,这里面会有很多锁,也就是当你开的协程少(具体看机器配置)时是没有什么问题的。 一旦你把协程数提高比如你代码里面的 10w 时, readLoop() 协程能分配到的计算资源有限,所以就会出现卡住或缓慢得到查询请求的情况。 你可以把协程数降低,单个协程的查询数提高,查询速度就会变快。 同理 copy 多个 mgo.Session 就会有启多个 readLoop() 协程 ,每个查询在对应的 readLoop ,执行回调就不会卡住了。
sujin190
2021-03-13 11:35:35 +08:00
https://github.com/go-mgo/mgo/pull/572

居然这么久了这个问题还在,那么我来更新下解决方案吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/333610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX