新手问题 channle不应该传map,或者深拷贝、加锁避免并发读写,有没有更好的办法

ianwoolf · 2017年02月23日 · 最后由 ianwoolf 回复于 2017年02月27日 · 527 次阅读

从 channle 接到 map 指针,进行处理的时候,遇到了并发读问题。

是否 channle 不应该传 map,或者进行深拷贝、加锁以避免并发读,有木有更好的办法?

其他类型呢,slice 或其他指针呢,如果只读的话,应该可以不加锁吧。麻烦大神解答

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

加锁好蠢 深拷贝解决 想知道有木有大神有更好的解决办法

routine 跑 func 也一样的问题

加锁不蠢,该加锁而不加锁才蠢。 只读数据,当然不需要加锁,但是你要确定这是read-only。 当然可以用chan做同步,但前提是确定你读懂了https://golang.org/ref/mem

很多场景是需要加锁的,我的做法是在外面套一层,把锁和 map 封装到一起,送进 channel。

我的场景是这样:单台机器 5w 的 qps,每个请求进来,会有一系列处理流程。这个地方是一个比较核心的处理节点。

开始忽略了一个处理节点可能会初始话一个字段,但这个初始化是只涉及这个处理流程节点

这里如果加锁,这个地方锁的消耗会比较高,影响有点大。所以感觉加锁意义不大,略蠢。我直接把那个字段深拷贝了一下,送进 channle

可能我没说清楚,我想说的是哪些场景适合加锁,哪些场景适合穿个深拷贝 或者大神们的习惯是什么?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册