У меня есть следующие настройки:
- 2 Серверы с fqdn usa.local и gca.local
- 1 erlang-узел на каждом из них с именем alice@usa.local и bob@ gca.local
Когда я запускаю Алису (alice:start/0
) на alice@usa.local, она порождает связанного Боба (bob:start/1
) на gca.local.Обе обработки являются ловушечными выходами.
Когда Алиса что-то умирает, Боб получает уведомление и продолжает работать.Когда Боб умирает от чего-то, Алиса получает уведомление и продолжает работать.
Когда я разрываю сетевое соединение, Алиса получает уведомление о том, что Боб умер от noconnection
, и процесс bob умирает на bob@gca.local.
Я не хочу, чтобы это произошло.Я хочу, чтобы Боб продолжал работать, хотя он теряет связь с Алисой.
Мои вопросы:
- Имеет ли это что-то, что я изначально породил Боба изузел Алисы?
- Как я могу заставить Боба пережить потерю соединения?
Вот код:
-module (alice).
-compile (export_all).
start () ->
register (alice, spawn (fun init/0) ).
stop () ->
whereis (alice) ! stop.
init () ->
process_flag (trap_exit, true),
Bob = spawn_link ('bob@gca.local', bob, start, [self () ] ),
loop (Bob).
loop (Bob) ->
receive
stop -> ok;
{'EXIT', Bob, Reason} ->
io:format ("Bob died of ~p.~n", [Reason] ),
loop (Bob);
Msg ->
io:format ("Alice received ~p.~n", [Msg] ),
loop (Bob)
end.
-module (bob).
-compile (export_all).
start (Alice) ->
process_flag (trap_exit, true),
register (bob, self () ),
loop (Alice).
loop (Alice) ->
receive
stop -> ok;
{'EXIT', Alice, Reason} ->
io:format ("Alice died of ~p.~n", [Reason] ),
loop (Alice);
Msg ->
io:format ("Bob received ~p.~n", [Msg] ),
loop (Alice)
after 5000 ->
Alice ! "Hi, this Bob",
loop (Alice)
end.