Erlang - супервизор не перезапускает рабочий процесс

Я играю с супервизорами Erlang OTP и хочу создать простое приложение с супервизором и работником.

Я создал простой воркер на основе gen_server, который принимает 2 числа и делит первое на второе. А если второе число - 0, то вылетает с ошибкой.

И у меня есть супервайзер, который теоретически должен возобновить работу в случае неудачи. Но когда я запускаю приложение, рабочий не перезапускается после сбоя. Вместо этого ракушка давит. Я предполагаю, что это происходит из-за того, какgen_server:call ведет себя в случае ошибки, но я не уверен.


Рабочий:

-module(my_worker).
-behaviour(gen_server).
-export([init/1,handle_call/3,create/0,terminate/2]).

create() -> gen_server:start({local,my_calc},?MODULE,0,[]).

init(_) -> {ok, {}}.

handle_call({divide, _, 0}, _From, State) ->
  {stop, div_by_zero, State};
handle_call({divide, X, Y}, _From, State) ->
  {reply, X / Y, State}.

terminate(Reason,State) ->
  io:format("Terminated because of ~p", [Reason]).

Руководитель:

-module(my_supervisor).
-behaviour(supervisor).
-export([init/1,create/0]).

create() -> supervisor:start_link(?MODULE,{}).

init(_) ->
  {
    ok,
    {
       #{strategy => one_for_one, intensity => 10, period => 1000},
      [
        #{id => child_id1,
          start => {my_worker, create, []},
          restart => permanent,
          shutdown => 1000,
          type => worker,
          modules => [my_worker]
        }
      ]
    }
  }.

Ракушка:

c(my_worker).
c(my_supervisor).

my_supervisor:create().
gen_server:call(my_calc,{divide, 10, 2}). % 5.0
gen_server:call(my_calc,{divide, 10, 0}). % Everything dies
gen_server:call(my_calc,{divide, 10, 2}). % Worker is dead

0 ответов

Другие вопросы по тегам