是否可以向elixir/erlang中的所有子进程发送消息?

lim*_*imp 5 erlang message-passing elixir

让我们想象一下,我在elixir中产生了多个子进程.

defmodule Child do
  def start(name) do
    receive do
      msg -> IO.puts "Message received by #{name}: #{inspect msg}"
    end
  end
end

defmodule Parent do
  def main do
    child1 = spawn_link (fn -> Child.start("1") end)
    child2 = spawn_link (fn -> Child.start("2") end)
    child3 = spawn_link (fn -> Child.start("3") end)
  end
end
Run Code Online (Sandbox Code Playgroud)

反正我是否可以向当前流程(或其他流程)的所有孩子发送消息?

send_to_children self(), "hello to all children"
Run Code Online (Sandbox Code Playgroud)

在某种程度上,我可以告诉运行时将消息广播到链接到当前进程的所有进程?我当然可以将所有生成的pid存储在某种数据结构中并循环遍历它,但是如果有某种规范方法可以做到这一点,那么它似乎会更高效,更不容易出错.

Dog*_*ert 8

由于您正在使用spawn_link,您可以获取所有链接进程的列表并向其发送消息:

defmodule Child do
  def start(name) do
    receive do
      msg -> IO.puts "Message received by #{name}: #{inspect msg}"
    end
  end
end

defmodule Parent do
  def main do
    child1 = spawn_link (fn -> Child.start("1") end)
    child2 = spawn_link (fn -> Child.start("2") end)
    child3 = spawn_link (fn -> Child.start("3") end)
    {:links, links} = Process.info(self, :links)
    for pid <- links do
      send pid, :foo
    end
  end
end

Parent.main
:timer.sleep(1000)
Run Code Online (Sandbox Code Playgroud)

输出:

Message received by 2: :foo
Message received by 1: :foo
Message received by 3: :foo
Run Code Online (Sandbox Code Playgroud)

我认为不可能直接获得流程的子进程列表:http://erlang.org/pipermail/erlang-questions/2013-April/073125.html.如果你从主管那里产生它们,有些方法,但不是任意的情况.

  • 这种方法的问题是链接是双向的.因此,如果您在主管下启动Child,那么作为父主管的主管也将在列表中并接收消息.最好存储要与之交谈的PID的名称,或者将它们置于主管下并使用Supervisor API. (5认同)