Важно отметить, что процесс умирает только в том случае, если связанный процесс завершается по причине, отличной от «нормальной», что означает, что процесс, который просто завершает свое выполнение, не уничтожает связанные с ним процессы.(источник http://www.erlang.org/doc/reference_manual/processes.html#id204170) Я думаю, что это важный аспект Erlang, который не следует неправильно истолковывать.
Следующий исходный код показывает это:
1> spawn(
1> fun() ->
1> io:format("outer ~p~n", [self()]),
1> spawn_link(
1> fun () ->
1> io:format("inner ~p~n", [self()]),
1> receive
1> Msg -> io:format("received ~p~n", [Msg])
1> end
1> end)
1> end).
outer <0.37.0>
<0.37.0>
inner <0.38.0>
2> is_process_alive(pid(0,37,0)).
false
3> pid(0,38,0) ! test.
received test
test
4>
Вы можете видеть, чтовызывающая сторона <0.37.0> не запущена, но процесс <0.38.0> все еще находится там, ожидая сообщения.
В любом случае супервизор не прекратит работу , когда вызывающая сторона завершит работупоскольку диспетчер перехватывает сигналы выхода. Конечно, если он не запрограммирован на это. Но я изучил исходный код и не смог его найти, но, увы, мой анализ мог быть слишком поверхностным.
У вас естьмне повезло с этим? Я попробую запустить несколько тестов и посмотреть, смогу ли я выяснить, что происходит.