OTP:在具有名称的主管下启动 GenEvent
OTP: Start GenEvent under Supervisor With Name
我正在尝试创建一个具有特定名称的 GenEvent 进程(对于这个问题,我将使用 {:global, :x}
)。如果我正常创建 GenEvent,例如GenEvent.start_link([name: {:global, :x}])
,我可以用那个名字访问 GenEvent。那挺好的。但我也想在监督树下创建 GenEvent。为此,我将 genevent 放入 Supervision.Spec worker
规范中,这就是事情爆发的时候。
iex(1)> {:ok, sup} = Supervisor.start_link([], strategy: :one_for_one)
{:ok, #PID<0.127.0>}
iex(2)> Supervisor.start_child(sup, Supervisor.Spec.worker(GenEvent, [name: {:global, :x}], []))
{:error,
{{:EXIT,
{:function_clause,
[{GenEvent, :start_link, [name: {:global, :x}],
[file: 'lib/gen_event.ex', line: 358]},
{:supervisor, :do_start_child, 2, [file: 'supervisor.erl', line: 343]},
{:supervisor, :handle_start_child, 2, [file: 'supervisor.erl', line: 715]},
{:supervisor, :handle_call, 3, [file: 'supervisor.erl', line: 400]},
{:gen_server, :try_handle_call, 4, [file: 'gen_server.erl', line: 629]},
{:gen_server, :handle_msg, 5, [file: 'gen_server.erl', line: 661]},
{:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 239]}]}},
{:child, :undefined, GenEvent, {GenEvent, :start_link, [name: {:global, :x}]},
:permanent, 5000, :worker, :dynamic}}}
我做错了什么?
(此答案来自 #elixir
中 irc.freenode.net
的 asonge
。谢谢!)
Supervisor.Spec.worker
函数的 args
值采用参数列表传递给函数。对于 GenEvent.start_link
,它采用一个列表参数。因此,我需要传递一个列表,其中包含一个元素(start_link
的 args 数组),这是 start_link
想要的列表。因此,对 worker
的调用是 Supervisor.Spec.worker(GenEvent, [[name: {:global, :x}]], [])
.
我正在尝试创建一个具有特定名称的 GenEvent 进程(对于这个问题,我将使用 {:global, :x}
)。如果我正常创建 GenEvent,例如GenEvent.start_link([name: {:global, :x}])
,我可以用那个名字访问 GenEvent。那挺好的。但我也想在监督树下创建 GenEvent。为此,我将 genevent 放入 Supervision.Spec worker
规范中,这就是事情爆发的时候。
iex(1)> {:ok, sup} = Supervisor.start_link([], strategy: :one_for_one)
{:ok, #PID<0.127.0>}
iex(2)> Supervisor.start_child(sup, Supervisor.Spec.worker(GenEvent, [name: {:global, :x}], []))
{:error,
{{:EXIT,
{:function_clause,
[{GenEvent, :start_link, [name: {:global, :x}],
[file: 'lib/gen_event.ex', line: 358]},
{:supervisor, :do_start_child, 2, [file: 'supervisor.erl', line: 343]},
{:supervisor, :handle_start_child, 2, [file: 'supervisor.erl', line: 715]},
{:supervisor, :handle_call, 3, [file: 'supervisor.erl', line: 400]},
{:gen_server, :try_handle_call, 4, [file: 'gen_server.erl', line: 629]},
{:gen_server, :handle_msg, 5, [file: 'gen_server.erl', line: 661]},
{:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 239]}]}},
{:child, :undefined, GenEvent, {GenEvent, :start_link, [name: {:global, :x}]},
:permanent, 5000, :worker, :dynamic}}}
我做错了什么?
(此答案来自 #elixir
中 irc.freenode.net
的 asonge
。谢谢!)
Supervisor.Spec.worker
函数的 args
值采用参数列表传递给函数。对于 GenEvent.start_link
,它采用一个列表参数。因此,我需要传递一个列表,其中包含一个元素(start_link
的 args 数组),这是 start_link
想要的列表。因此,对 worker
的调用是 Supervisor.Spec.worker(GenEvent, [[name: {:global, :x}]], [])
.