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存储在某种数据结构中并循环遍历它,但是如果有某种规范方法可以做到这一点,那么它似乎会更高效,更不容易出错.
由于您正在使用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.如果你从主管那里产生它们,有些方法,但不是任意的情况.