我创建了一个名为Supervisor 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: []]
Run Code Online (Sandbox Code Playgroud)
灵药文件之间的差异name和child_id不明确的,并且似乎id: something对工人和选择name: something流程和监事的选择.我很迷惑.
从上面看,它似乎id并registered_name是相同的.
我想让我的主管监督多个孩子,但默认情况下我不能这样做(我得到了:already_started错误).我应该更改名称和ID,还是只更改?
ID只是一个内部标识符,仅由工人的主管使用。对于同一主管中的所有工人,它必须是唯一的。
名称是您可以用来寻址进程的值,而不是使用其PID。
您看到名称和ID值相同的原因是,默认情况下,主管将进程的名称用作工人ID。