返回信息流之前项目用的是1.5的版本,最近打算升级到1.7 但是因为go在1.6的时候增加了对map并发访问检测,应该用怎么处理比较好呢,代码里有大量的全局map,如果全部用锁的话感觉效率太低,,,现在还没有想到好的办法
这是一条镜像帖。来源:北邮人论坛 / golang / #614同步于 2016/10/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
怎么处理map的并发访问
PhonChen
2016/10/5镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
才发现没有打完 一直听Go的核心理念是 shared mem by communicated 所以还是比较建议用通道来实现共享内存的,不过高并发的东西有这么多共享map真的合适么,最近在做中间件,协程共享内存池、连接池什么的已经让我优化到快吐了。至于说上面提到用Redis的我感觉占用空间特别大时并且有富裕机器时可以这么搞,因为Redis本身也只是做了串行化,加上I/O什么的开销,只有在本地内存吃不起扩容才会考虑。嗯嗯
【 在 PhonChen 的大作中提到: 】
: 用啥? 通道么?
协程共享这些东西有什么要优化的?
【 在 xuewindy 的大作中提到: 】
: 才发现没有打完 一直听Go的核心理念是 shared mem by communicated 所以还是比较建议用通道来实现共享内存的,不过高并发的东西有这么多共享map真的合适么,最近在做中间件,协程共享内存池、连接池什么的已经让我优化到快吐了。至于说上面提到用Redis的我感觉占用空间特别大时并且有富裕机器时可以这么搞,因为Redis本身也只是做了串行化,加上I/O什么的开销,只有在本地内存吃不起扩容才会考虑。嗯嗯
顶concurrent-map。
之前看过一个视频,貌似锁操作比channel操作轻量很多.https://www.youtube.com/watch?v=ZuQcbqYK0BY
而且,如果把所有map操作封装到一个goroutine里,就等于所有map操作都串行了。
所以我觉得就参照java之类的concurrent map的思路就挺好的,部分锁一下。
有携程也不一定要这样用。。。erlang不也还有ets来做全局map么。
【 在 PhonChen 的大作中提到: 】
: 之前项目用的是1.5的版本,最近打算升级到1.7 但是因为go在1.6的时候增加了对map并发访问检测,应该用怎么处理比较好呢,代码里有大量的全局map,如果全部用锁的话感觉效率太低,,,现在还没有想到好的办法