【问题标题】:Send message to all processes向所有进程发送消息
【发布时间】:2020-05-15 21:51:30
【问题描述】:

我是 Elixir 的新手,我有一堆正在运行的进程,我需要从另一个进程向所有进程广播一条消息。在查阅了Process 的文档后,我仍然不知道如何实现。

这可能不是最好的比较,但是有没有像 Java 中的“notifyAll”这样的函数?

【问题讨论】:

  • 您要发送info 消息吗?同步?异步?保证交货?点对点?简单PubSub?如果您希望我们了解您的要求,请提供指向 notifyAll 文档的链接。
  • 我正在尝试制作一个迷你游戏,我有一个召唤骷髅的死灵法师(每个骷髅都由一个生成的进程 skProcess = spawn(SkeletonKnight, :battle, [skeletonKnightHp, skID]) 和注册 Process.register(skProcess, :"Skeleton_#{skID}") 表示)。我还有一个龙进程,它有一个 龙息 技能,可以伤害所有骷髅,这个应该向所有其他骷髅发送消息,其中包含消息类型和伤害值(例如,发送消息到一个骨架:send(:Skeleton_1, {:info, damage}))。 龙息部分对我来说很有挑战性。

标签: erlang elixir


【解决方案1】:

这种方法(在 cmets 中描述)首先容易受到原子 DDOS 的攻击。 2M 的骨架会杀死你的 Erlang VM,因为原子不会被垃圾收集。此外,如Kernel.spawn/3 所述,生成不受监控的进程也不是一个好主意。

通常,您使用DynamicSupervisor 来监督孩子,它会公开which_children/1,以便轻松枚举并向所有孩子发送消息。

另一种方法是使用 :pg 模块。让你的骨架加入进程组并向所有成员发送消息。

也可以在:pg 之上使用Phoenix.PubSub 抽象 Envio 来简化PubSub 模式的实现。


如果您仍然希望使用 spawn/3 的初始方法起作用,请启动跟踪所有骨架的专用进程(它们可能会在启动时向其发送“类似寄存器”的消息)并通过所有在此过程中生成骨架,发送所有消息。

【讨论】:

  • 我会采用DynamicSupervisor 的方法,谢谢!
猜你喜欢
  • 2020-09-09
  • 2016-08-09
  • 2011-05-30
  • 1970-01-01
  • 2014-10-08
  • 2019-04-29
  • 2021-05-03
相关资源
最近更新 更多