小编典典

应该基于goroutine /基于通道的机制替换并发映射吗?

go

有一个map[PlayerId]Player检查玩家是否在线,并执行状态变更知道他的ID。这必须同时从多个goroutine中完成。

现在,我计划使用streamrail的并发映射,但是常规映射和使用通道的同步又如何呢?

  • 在Go中应该始终首选它吗?
  • 在某些情况下应该首选吗?
  • 他们基本上只是完成同一件事的两种方法吗?

顺便说一句,我知道口号:

不通过共享内存进行通信通过通信共享内存

但是在stdlib中有锁定机制,而在文档中没有关于根本不使用它们的词。


阅读 268

收藏
2020-07-02

共1个答案

小编典典

从最简单的方法开始:地图和RWMutex。

我不建议使用并发库,除非它已被广泛使用和测试(例如,请参见https://github.com/streamrail/concurrent-
map/issues/6)。

请注意,即使您使用github.com/streamrail/concurrent-map,在以下情况下仍然需要实现自己的同步(使用RWMutex):

if _, ok = m[k]; !ok {
   m[k] = newPlayer()
}

如果您的游戏非常受欢迎并且被很多玩家玩过,您会发现这种方法无法扩展,但只有在出现问题时我才会担心。

2020-07-02