[erlang-questions] How to identify the process which died and restart it?

Erik Søe Sørensen eriksoe@REDACTED
Wed Jan 14 17:33:09 CET 2015


You need to keep a table of either pid-> task (function or whatever) or
mref-> task.
There are several representation choices for the table. A {Key, Value} list
would be the simplest.
Some of the key functions in the lists module might be of help - or you
could do the manipulations directly.

/Erik
Den 14/01/2015 04.52 skrev "Harit Himanshu" <harit.subscriptions@REDACTED>:

> I was working on the following problem and wrote the code that works, but
> I have conceptual questions which are still bothering me. So I thought to
> put them in community and seek recommendations and guidance
>
> *Question*
> Write a function that starts and monitors several worker processes. If any
> of the worker processes dies abnormally, restart it.
>
> My attempt looks like
> monitor_workers(F, NumberOfWorkers) ->
>   spawn(error_handling, monitor_workers_loop, [F, NumberOfWorkers]).
>
>
> monitor_workers_loop(F, NumberOfWorkers) ->
>   Workers = [spawn_monitor(F) || _Worker <- lists:seq(1, NumberOfWorkers)],
>   io:format("started workers: ~p.~n", [Workers]),
>   receive
>     {'DOWN', _, process, _, _} ->
>       io:format("one of workers killed, starting one.~n"),
>       monitor_workers_loop(F, 1)
>   end.
>
> and when I run, I see
>
> 1> c(error_handling).
> {ok,error_handling}
> 2>
> 2> error_handling:monitor_workers(fun()-> area_server0:loop() end, 2).
> started workers: [{<0.40.0>,#Ref<0.0.0.81>},{<0.41.0>,#Ref<0.0.0.82>}].
> <0.39.0>
> 3>
> 3>  Worker1 = list_to_pid("<0.40.0>").
> <0.40.0>
> 4>
> 4> Worker2 = list_to_pid("<0.41.0>").
> <0.41.0>
> 5>
> 5> exit(Worker1, kill).
> one of workers killed, starting one.
> started workers: [{<0.45.0>,#Ref<0.0.0.98>}].
> true
> 6> exit(Worker2, kill).
> one of workers killed, starting one.
> started workers: [{<0.47.0>,#Ref<0.0.0.105>}].
> true
> 7>
>
> *Problem(s)?*
>
>    1. A better way to solve this would be pass in different
>    functions(than same, what I did) and let workers work on different
>    problems. In such a scenario all we know if Pid and Ref to the workers.
>    2. When any process fails, it matches {'DOWN', Ref, process, Pid,
>    Why}, and given this context how could I identify what function this
>    process was running?
>
> I am very new to Erlang so have not much knowledge to solve such problems.
>
> Thank you
> + Harit Himanshu
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150114/aa2acde1/attachment.htm>


More information about the erlang-questions mailing list