有一个map[PlayerId]Player检查玩家是否在线,并执行状态变更知道他的ID。这必须同时从多个goroutine中完成。
map[PlayerId]Player
现在,我计划使用streamrail的并发映射,但是常规映射和使用通道的同步又如何呢?
顺便说一句,我知道口号:
不通过共享内存进行通信通过通信共享内存
但是在stdlib中有锁定机制,而在文档中没有关于根本不使用它们的词。
从最简单的方法开始:地图和RWMutex。
我不建议使用并发库,除非它已被广泛使用和测试(例如,请参见https://github.com/streamrail/concurrent- map/issues/6)。
请注意,即使您使用github.com/streamrail/concurrent-map,在以下情况下仍然需要实现自己的同步(使用RWMutex):
if _, ok = m[k]; !ok { m[k] = newPlayer() }
如果您的游戏非常受欢迎并且被很多玩家玩过,您会发现这种方法无法扩展,但只有在出现问题时我才会担心。