erlang - 如何使用非 gen_servers 的工作人员运行主管?

标签 erlang erlang-supervisor

您好,我正在尝试运行一个 supervisor,其工作人员不是 gen_server。 为了简洁起见,我的主管与工作人员在同一模块中定义:

我不断收到此错误,并且尝试将 MFA 属性放入 [ ] 中,但无济于事。我还添加了 ChildSpec[]中。 我缺少什么?

我不希望我的主管在启动时有任何 worker 。

错误

>  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时,你应该定义ChildSpecinit所有 child 都使用相同的 ChildSpec

如果您需要不同,请改用“one_for_one”策略。

对于simple_one_for_one :

supervisor:start_child/2 的第二个参数必须是一个列表,该列表将与 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.

关于erlang - 如何使用非 gen_servers 的工作人员运行主管?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61048233/

相关文章:

erlang - 从两个进程访问套接字

Erlang Supervisor 重新启动与已关闭主机的连接的策略

erlang - 主管进程如何监控进程?可以在 JVM 上做同样的事情吗?

tcp - 如何检测 tcp 客户端与 gen_tcp 断开连接?

erlang - gen_server 启动了吗?

erlang - 如何找到 OTP 流程的主管?

architecture - Google的分布式监管模型的体系结构

erlang - 尽力而为的 OTP 监督

ssh - 使用 ssh 端口转发运行 Erlang Observer

erlang - Elixir/Erlang 中选择性 `receive` 的性能