在 Elixir 中传递消息

Message passing in Elixir

最近我开始学习 Elixir,但我在实现部分遇到了一些困难。 我想我确实理解 supervisor 和 children 的概念,但我不太习惯函数式编程。 你能给我一个这种场景的实现示例吗:

Root Supervisor 监管进程A 和B。B 也是其他一些进程的监管者。 A 应该不断地向 B 传递消息,B 应该能够将这些消息传递给它的 children。此外,B 的 children 应该能够将消息传递回 B。A 和 B 应该始终 运行.

请提供此类场景的最简单实施示例,或提供有关如何实施 parent-child、child-child 之间消息传递的一些线索。考虑到我正在为项目使用 mix。此外,A 和 B 应该使用 GenServer

例如,假设在 root supervisor 中我有这样的东西,但现在我不知道如何将消息从 A 传递到 B。

    use Supervisor

    def start_link(opts) do
      Supervisor.start_link(__MODULE__, :ok, opts)
    end

    def start(_type, _args) do
        children = [
          {A, [name: NameForA]},
          {B, [name: NameForB]}}
        ]
    
        opts = [strategy: :one_for_one, name: Supervisor]
    
        # See https://hexdocs.pm/elixir/Supervisor.html
        # for other strategies and supported options
    
        Supervisor.start_link(children, opts)
    end

我的假设是我应该以某种方式将 A 的 PID 传递给 B 以了解将消息发送到哪里,但我真的不知道如何才能像这样获得 PID。也许我应该使用另一种方法? 欢迎任何类型的提示或提示。

目标进程可能由 Process.dest() 类型寻址,进程名称正是为此目的而存在。

在上面的示例中,可以将消息发送到 NameForA

另一方面,在 Supervisor 中,行为明确致力于监督而不是干扰直接消息传递。也就是说,您可能需要更复杂的监督树。