基于 goroutine/channel 的机制应该取代并发映射吗?

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

现在我打算使用streamrail 的 concurrent map,但是使用通道的常规地图和同步呢?

  • 在 Go 中它应该总是首选吗?

  • 在某些情况下它应该是首选吗?

  • 它们基本上只是完成同一件事的两种方法吗?

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

不要通过共享内存来通信 通过通信共享内存

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


人到中年有点甜
浏览 146回答 1
1回答

慕仙森

从最简单的方法开始:地图和 RWMutex。我不推荐使用并发库,除非它被广泛使用和测试(例如,参见https://github.com/streamrail/concurrent-map/issues/6)。请注意,即使您使用 github.com/streamrail/concurrent-map,您仍然需要在以下场景中实现自己的同步(使用 RWMutex):if _, ok = m[k]; !ok {   m[k] = newPlayer()}如果您的游戏非常受欢迎并且被很多玩家玩,您会发现这种方法无法扩展,但只有当它成为问题时我才会担心。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go