Ссылки в двух направлениях. Когда вы создаете связь между A и B и связью между A и C, все они находятся в одной и той же «области отказа». то же сообщение выхода не распространяется по всем ссылкам, но каждая ссылка является каналом распространения сообщения «EXIT». Если B сбой, он отправляет выход в A, поэтому он сбой, и когда он сбой, он отправляет выход на C. Этот вид цепочки может быть сколь угодно длинным или широким.
Процесс, который захватывает выходы, прерывает эту размножение и обрабатывает любое сообщение «EXIT», которое оно получает как просто сообщение, а не как указание, оно также должно быть аварийно завершено.
Вы можете создать какой-либо форме графа вы хотите со ссылками (понимание они двунаправленной, конечно - сделать циклический график вам нужно будет мониторы, которые являются одним из способов), но большую часть времени Программы Erlang разработаны на деревьях, где улов за выхождением происходит только возле корня дерева супервизорами.
Просто для удовольствия, вот иллюстрация, где авария распространяется через оболочку:
1> register(foo, spawn_link(fun() -> receive M -> io:format("~p~n", [M]) end end)).
true
2> register(bar, spawn_link(fun() -> receive M -> io:format("~p~n", [M]) end end)).
true
3> exit(whereis(bar), kill).
** exception exit: killed
4> foo ! hey.
** exception error: bad argument
in operator !/2
called as foo ! hey
Сначала мы икру два процесса, зарегистрированный как «Foo» и «бар», которые оба связаны с оболочкой , Все, что они делают, это сидеть и ждать, чтобы повторить какое-то сообщение. Прежде чем отправлять им какое-либо сообщение, мы жестоко убиваем «бар». 'сообщение о выходе bar отправляется в оболочку, поэтому оболочка умирает после строки 3 и перезапускается ее супервизором (поэтому мы получаем приглашение обратно в строке 4). Является ли «фу» еще живым? Мы пытаемся отправить ему сообщение, чтобы найти это ... он больше не существует! Когда оболочка разбилась, он отправил сообщение о выходе всем связанным процессам, а «foo» был одним из них (диспетчер оболочки - другой). «foo» не улавливал выходы, поэтому он умер, но супервизор оболочки был улавливающими выходами, поэтому получил сообщение {'EXIT', Proc, Reason}
(супервизор оболочки знал, что это оболочка и что его нужно перезапустить, и сделал это).
Вы имеете в виду, что у вас есть два процесса Erlang, а не два модуля? –
Думаю, вы можете так сказать. Каждый модуль имеет start_link(). – xcoder
@SteveVinoski Я отредактировал вопрос, чтобы сделать его более ясным. – xcoder