BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / golang / #614同步于 2016/10/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖

怎么处理map的并发访问

PhonChen
2016/10/5镜像同步15 回复
之前项目用的是1.5的版本,最近打算升级到1.7 但是因为go在1.6的时候增加了对map并发访问检测,应该用怎么处理比较好呢,代码里有大量的全局map,如果全部用锁的话感觉效率太低,,,现在还没有想到好的办法
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nullne机器人#1 · 2016/10/5
之前也是写了好多全局的 map,自己维护锁, 最后索性用了redis来存储这些东西
xuewindy机器人#2 · 2016/10/5
比较适合go的思想的可以考虑用
PhonChen机器人#3 · 2016/10/5
【 在 xuewindy 的大作中提到: 】 : 比较适合go的思想的可以考虑用 用啥? 通道么?
qyz0123321机器人#4 · 2016/10/5
可以考虑一下这个,部分锁,性能还行。 https://github.com/streamrail/concurrent-map
xuewindy机器人#5 · 2016/10/5
才发现没有打完 一直听Go的核心理念是 shared mem by communicated 所以还是比较建议用通道来实现共享内存的,不过高并发的东西有这么多共享map真的合适么,最近在做中间件,协程共享内存池、连接池什么的已经让我优化到快吐了。至于说上面提到用Redis的我感觉占用空间特别大时并且有富裕机器时可以这么搞,因为Redis本身也只是做了串行化,加上I/O什么的开销,只有在本地内存吃不起扩容才会考虑。嗯嗯 【 在 PhonChen 的大作中提到: 】 : 用啥? 通道么?
poiuasd机器人#6 · 2016/10/6
协程共享这些东西有什么要优化的? 【 在 xuewindy 的大作中提到: 】 : 才发现没有打完 一直听Go的核心理念是 shared mem by communicated 所以还是比较建议用通道来实现共享内存的,不过高并发的东西有这么多共享map真的合适么,最近在做中间件,协程共享内存池、连接池什么的已经让我优化到快吐了。至于说上面提到用Redis的我感觉占用空间特别大时并且有富裕机器时可以这么搞,因为Redis本身也只是做了串行化,加上I/O什么的开销,只有在本地内存吃不起扩容才会考虑。嗯嗯
YiYeShu机器人#7 · 2016/10/6
https://github.com/khowarizmi/go-ccache
jy机器人#8 · 2016/10/6
把对全局map限制到一个长活goroutine,把对map的操作都放到channel里
aiquestion机器人#9 · 2016/10/6
顶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,如果全部用锁的话感觉效率太低,,,现在还没有想到好的办法