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

标签 erlang elixir message-passing

让我们想象一下,我在 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

无论如何,我可以向当前进程(或其他进程)的所有子进程发送消息吗?
send_to_children self(), "hello to all children"

就像我可以告诉运行时向链接到当前进程的所有进程广播一条消息的某种方式?我当然可以将所有生成的 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)

输出:
Message received by 2: :foo
Message received by 1: :foo
Message received by 3: :foo

我认为不可能直接获得进程的子进程列表:http://erlang.org/pipermail/erlang-questions/2013-April/073125.html .如果您从主管处生成它们,则有多种方法,但不适用于任意情况。

关于erlang - 是否可以向 elixir/erlang 中的所有子进程发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48416742/

相关文章:

elixir - 将单个字符串转换为其代码点

c# - 通过 cmd 行传递消息的单实例应用程序?

objective-c - 委托(delegate)与消息传递

erlang - 为什么erlang整数使用28位?

erlang - 以原子方式替换关联的 pid(即注销和注册)

erlang - erlang的常见用例

erlang - 为什么在 : '{' ? 之前出现语法错误

elixir - 存储 GenServer 的 pid 以备将来使用

elixir - Map.get(分配, :key) returns nil instead of expected value in the view

c++ - MPI 程序只捕获来自等级 1 的消息