是" id"和"名称" Elixir主管/流程中的相同内容?

时间:2017-06-22 13:31:07

标签: elixir otp

我创建了一个名为ElectionManager.Application的主管和一名工人 然后我查看了这些过程的信息:

iex(3)> proc = Process.whereis(ElectionManager.Application)
#PID<0.158.0>

iex(4)> Process.info proc
[registered_name: ElectionManager.Application,
 current_function: {:gen_server, :loop, 7},
 initial_call: {:proc_lib, :init_p, 5}, status: :waiting, message_queue_len: 0,
 messages: [], links: [#PID<0.156.0>, #PID<0.159.0>],
 dictionary: ["$initial_call": {:supervisor, Registry.Supervisor, 1},
  "$ancestors": [#PID<0.156.0>]], trap_exit: true,
 error_handler: :error_handler, priority: :normal, group_leader: #PID<0.155.0>,
 total_heap_size: 986, heap_size: 610, stack_size: 10, reductions: 339,
 garbage_collection: [max_heap_size: %{error_logger: true, kill: true, size: 0},
  min_bin_vheap_size: 46422, min_heap_size: 233, fullsweep_after: 65535,
  minor_gcs: 2], suspending: []]

iex(7)> {id, child, type, modules} = Supervisor.which_children(proc) |> List.first
{ElectionManager.Application.PIDPartition0, #PID<0.159.0>, :worker,
 [Registry.Partition]}

iex(8)> Process.info child
[registered_name: ElectionManager.Application.PIDPartition0,
 current_function: {:gen_server, :loop, 7},
 initial_call: {:proc_lib, :init_p, 5}, status: :waiting, message_queue_len: 0,
 messages: [], links: [#PID<0.158.0>, #PID<0.156.0>],
 dictionary: ["$initial_call": {Registry.Partition, :init, 1},
  "$ancestors": [ElectionManager.Application, #PID<0.156.0>]], trap_exit: true,
 error_handler: :error_handler, priority: :normal, group_leader: #PID<0.155.0>,
 total_heap_size: 233, heap_size: 233, stack_size: 10, reductions: 47,
 garbage_collection: [max_heap_size: %{error_logger: true, kill: true, size: 0},
  min_bin_vheap_size: 46422, min_heap_size: 233, fullsweep_after: 65535,
  minor_gcs: 0], suspending: []]
在Elixir文档中,namechild_id之间的差异并不明确,工作人员似乎有id: something选项,流程似乎有name: something选项和监督员。我很困惑。
从上面看,似乎idregistered_name是相同的。

我希望让我的主管监督多个孩子,但默认情况下我不能这样做(我得到:already_started错误)。我应该更改名称和ID,还是只更改?

2 个答案:

答案 0 :(得分:5)

id只是一个内部标识符,仅供工作者的主管使用。它必须是同一主管中所有工人的独特之处。

名称是您可以使用其处理进程的值,而不是使用其PID。

您看到名称和ID的值相同的原因是,默认情况下,主管使用流程名称作为工作人员ID。

答案 1 :(得分:0)

该名称与主管无关。当您想要引用,监督或无人监督时,过程名称用于查找过程。

进程ID是BEAM用于进程的内部标识符,就像您的操作系统为每个进程提供一个id一样。 Supervisor捕获此id以便以后监视并重新启动它。

您给予主管的孩子ID,用于保存儿童规格。如果未明确提供,则它是用于启动子项的模块名称。它可以在以后用于检索子规范。

如果要使用同一模块启动多个子项,则必须显式指定子ID,因为两个子项不能具有相同的id(将子规范视为child_id =&gt; child_spec的哈希映射)。

如果你需要使用同一个模块启动多个孩子,也许你正在寻找主管的simple_one_to_one策略。使用此选项,您可以指定一次规范,并请求主管在运行时启动子项(与启动子项的其他项一样)。