当前位置: 首页 > 面试题库 >

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

羊舌迪
2023-03-14
问题内容

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

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

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

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

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • 我们有一个关于Spring框架的项目。它包含具有以下配置的Spring Security性: 它可以在一个Apache Tomcat服务器上工作。如果我尝试从另一个浏览器登录,我以前的http会话将过期。 null 所有这些方法都不起作用。我还发现了这个问题:https://github.com/spring-projects/spring-session/issues/65,它是两年前实现的。有

  • 我是新来的,想知道一些很基本的问题,我不能弄清楚。 为了发挥作用(对实际需要的抽象),我需要: 用常数固定的元素初始化字符串片断 遍历此切片并为每个元素运行一个goroutine 每个goroutine将花费一定的时间来处理元素(随机秒持续时间) 作业完成后,我希望goroutine将结果推送到一个通道 然后我需要捕获来自这个通道的所有结果(在一个从主goroutine调用的函数中),将它们附加到

  • 我们在基于服务的应用程序中使用作为一种事件总线。send方法和消息处理程序基于spring-messaging的类(从Spring-Integration4.0(+)开始)。事件是对实体的更改,需要由其他服务接收。 问题是:spring-messaging类被spring-amqp视为任意对象负载,因为它不被识别为spring-amqp。这会导致以下问题: 默认消息格式是序列化的Java对象。sp

  • TL; DR 我想以一种从AbstractP的映射方式来使用ModelMapper,然后在ModelMapper-Config中为每个子类调用特定的映射器,然后跳过其余的(abstrac类)映射。 这怎么可能?这是正确的做法吗?是否存在设计缺陷? 我所拥有的: 母公司: 一个子实体: 另一个子实体: 然后我有父DTO类: 一个孩子DTO: 另一个DTO: 在我的例子中,我将从控制器获取DTO,并在

  • 我的任务是取代电话号码与一个锚标签与链接和文本到我们的网站演示页。我们使用白标软件,它不允许我简单地更改文本,因为它链接到后端面板,你可以在那里更改电话号码,但你不能更改它为其他任何东西。 电话号码所在的代码段如下: 我需要保留到FAQ和联系人页面的链接,但要去掉这个: 并将其改为: 而不会改变网页上的任何其他内容或干扰网页上的任何其他内容。 我试图使用来尝试它,但它不起作用。有人有什么建议吗?