如何 运行 主管和不是 gen_servers 的工人?
How to run a supervisor with workers which are not gen_servers?
你好,我正在尝试 运行 一个 supervisor
的工人不是 gen_server
(s)。
为了简洁起见,我的主管与工人在同一模块中定义:
我一直收到这个错误,我尝试将 [ ]
中的 MFA
属性设置为否 avail.I 也尝试将 ChildSpec
设置为 [ ]
.
我错过了什么?
我不希望我的主管在启动时有任何工人。
错误
> X=sup:start_link().
> ** exception error: no match of right hand side value {error,
> {bad_start_spec,[]}}
> in function sup:start_link/0 (c:/Erlang/ProcessPool/sup.erl, line 6)
> =CRASH REPORT==== 5-Apr-2020::22:20:32.918000 === crasher:
> initial call: supervisor:sup/1
> pid: <0.280.0>
> registered_name: []
> exception exit: {bad_start_spec,[]}
> in function gen_server:init_it/6 (gen_server.erl, line 358)
> ancestors: [<0.273.0>]
> message_queue_len: 0
> messages: []
> links: [<0.273.0>]
> dictionary: []
> trap_exit: true
> status: running
> heap_size: 376
> stack_size: 27
> reductions: 205 neighbours:
模块
-module(sup).
-behaviour(supervisor).
-compile([export_all]).
start_link() ->
{ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, []),
Pid.
init(_Args) ->
RestartStrategy = {simple_one_for_one, 10, 60},
{ok, {RestartStrategy,[]}}.
add(Sup,Value)-> #adding child
ChildSpec = {
ch1,
{sup, start, [Value]},
permanent,
brutal_kill,
worker,
[ch1]
},
supervisor:start_child(Sup,ChildSpec).
start([Value])-> #child's start_link equivalent (non-genserver)
spawn_link(?MODULE,initworker,[self(),Value]).
initworker(From,Value)-> #child's init
receive
MSG->From ! {got_msg,Value,MSG}
end.
当你使用 simple_one_for_one
时,你应该在 init
中定义 ChildSpec
并且所有 children 使用相同的 ChildSpec
。
如果您需要不同,请改用 'one_for_one' 策略。
对于simple_one_for_one
:
supervisor:start_child/2
的第二个参数必须是一个列表,它将与 child 中定义的 ChildSpec
启动函数参数的默认参数组合。
在这里,我快速修改了代码,使其适用于您。
-module(sup).
-behaviour(supervisor).
-compile([export_all]).
start_link() ->
{ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, []),
Pid.
init(_Args) ->
RestartStrategy = {simple_one_for_one, 10, 60},
ChildSpec = {
ch1,
{sup, start, []},
permanent,
brutal_kill,
worker,
[sup]
},
{ok, {RestartStrategy,[ChildSpec]}}.
add(Sup,Value)->
supervisor:start_child(Sup,[Value]).
start(Value)->
P = spawn(?MODULE, initworker,[]),
P!{self(),Value},
{ok,P}.
initworker()->
receive
{From, MSG} -> io:format(" Value is ~p~n", [MSG])
end.
你好,我正在尝试 运行 一个 supervisor
的工人不是 gen_server
(s)。
为了简洁起见,我的主管与工人在同一模块中定义:
我一直收到这个错误,我尝试将 [ ]
中的 MFA
属性设置为否 avail.I 也尝试将 ChildSpec
设置为 [ ]
.
我错过了什么?
我不希望我的主管在启动时有任何工人。
错误
> X=sup:start_link().
> ** exception error: no match of right hand side value {error,
> {bad_start_spec,[]}}
> in function sup:start_link/0 (c:/Erlang/ProcessPool/sup.erl, line 6)
> =CRASH REPORT==== 5-Apr-2020::22:20:32.918000 === crasher:
> initial call: supervisor:sup/1
> pid: <0.280.0>
> registered_name: []
> exception exit: {bad_start_spec,[]}
> in function gen_server:init_it/6 (gen_server.erl, line 358)
> ancestors: [<0.273.0>]
> message_queue_len: 0
> messages: []
> links: [<0.273.0>]
> dictionary: []
> trap_exit: true
> status: running
> heap_size: 376
> stack_size: 27
> reductions: 205 neighbours:
模块
-module(sup).
-behaviour(supervisor).
-compile([export_all]).
start_link() ->
{ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, []),
Pid.
init(_Args) ->
RestartStrategy = {simple_one_for_one, 10, 60},
{ok, {RestartStrategy,[]}}.
add(Sup,Value)-> #adding child
ChildSpec = {
ch1,
{sup, start, [Value]},
permanent,
brutal_kill,
worker,
[ch1]
},
supervisor:start_child(Sup,ChildSpec).
start([Value])-> #child's start_link equivalent (non-genserver)
spawn_link(?MODULE,initworker,[self(),Value]).
initworker(From,Value)-> #child's init
receive
MSG->From ! {got_msg,Value,MSG}
end.
当你使用 simple_one_for_one
时,你应该在 init
中定义 ChildSpec
并且所有 children 使用相同的 ChildSpec
。
如果您需要不同,请改用 'one_for_one' 策略。
对于simple_one_for_one
:
supervisor:start_child/2
的第二个参数必须是一个列表,它将与 child 中定义的 ChildSpec
启动函数参数的默认参数组合。
在这里,我快速修改了代码,使其适用于您。
-module(sup).
-behaviour(supervisor).
-compile([export_all]).
start_link() ->
{ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, []),
Pid.
init(_Args) ->
RestartStrategy = {simple_one_for_one, 10, 60},
ChildSpec = {
ch1,
{sup, start, []},
permanent,
brutal_kill,
worker,
[sup]
},
{ok, {RestartStrategy,[ChildSpec]}}.
add(Sup,Value)->
supervisor:start_child(Sup,[Value]).
start(Value)->
P = spawn(?MODULE, initworker,[]),
P!{self(),Value},
{ok,P}.
initworker()->
receive
{From, MSG} -> io:format(" Value is ~p~n", [MSG])
end.