I created a Supervisor named ElectionManager.Application and a worker.
Then I looked at the information of those processes:
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: []]
in the Elixir document, the differences between name and child_id wasn't clear, and there seems a id: something option for workers and name: something option for processes and Supervisors. I am confused.
From above, it seems that id and registered_name are the same.
I want to have my Supervisor to supervise multiple children, but I cannot do that by default (I get the :already_started error). Should I change both the name and the id, or only either?
The id is just an internal identifier used only by the supervisor of a worker. It has to be unique for all workers in the same supervisor.
The name is the value that you can address a process with, instead of using its PID.
The reason you're seeing the same values for the name and the id is that the supervisor uses the name of the process for the worker id by default.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With