proc = Process.whereis(E-6ren">
gpt4 book ai didi

elixir - Elixir Supervisor/Process 中的 "id"和 "name"是否相同?

转载 作者:行者123 更新时间:2023-12-04 12:17:08 24 4
gpt4 key购买 nike

我创建了一个名为 ElectionManager.Application 的主管和一名 worker 。
然后我查看了那些进程的信息:

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 文档中, name 之间的区别和 child_id不清楚,似乎有 id: something worker 和 name: something 的选项进程和主管的选项。我很迷惑。
从上面看来, idregistered_name是相同的。

我想让我的主管监督多个 child ,但默认情况下我不能这样做(我收到 :already_started 错误)。我应该同时更改名称和 ID,还是只更改其中之一?

最佳答案

id 只是一个内部标识符,仅供 worker 的主管使用。对于同一主管中的所有 worker ,它必须是唯一的。

名称是您可以用来寻址进程的值,而不是使用其 PID。

您看到 name 和 id 的值相同的原因是主管默认使用进程名称作为 worker id。

关于elixir - Elixir Supervisor/Process 中的 "id"和 "name"是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44700872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com