2014-10-17 2 views

ответ

3

В вашем примере процесс, который называется start_link/1, и процесс начинается как (?MODULE, Name, Args).

Ошибочно думать, что для обмена данными необходимо связать два процесса. Данные связывают судьбу двух процессов. Если кто-то умирает, другой умирает, если системный процесс не запускает ссылку («системный процесс» означает тот, который улавливает выходы). Это, вероятно, не то, что вы хотите. Если вы пытаетесь избежать тупиковой ситуации или сделать что-то другое, чем просто тайм-аут во время синхронной передачи сообщений, если процесс вы отправляете сообщение для плашек, прежде чем ответить, рассмотреть что-то вроде этого:

ask(Proc, Request, Data, Timeout) -> 
    Ref = monitor(process, Proc), 
    Proc ! {self(), Ref, {ask, Request, Data}}, 
    receive 
     {Ref, Res} -> 
      demonitor(Ref, [flush]), 
      Res; 
     {'DOWN', Ref, process, Proc, Reason} -> 
      some_cleanup_action(), 
      {fail, Reason} 
    after 
     Timeout -> 
      {fail, timeout} 
    end. 

Если вы просто пытаетесь икру работник, который должен дать вам ответ, вы можете подумать об использовании spawn_monitor вместо этого и используя его {pid(), reference()} в качестве сообщения, которое вы слушаете в ответ.

Как я уже упоминал выше, процесс, начинающийся с ссылки, не умрет, если он улавливает выходы, но вы в большинстве случаев избегаете улавливания выходов. В качестве основного правила используйте process_flag(trap_exit, true) как немного как возможно. Получение trap_exit во всем случае будет иметь структурных эффектов, которые вы не намереваетесь в конце концов, и его одной из немногих вещей в Эрланге, которую трудно реорганизовать позже.

+0

Идея, стоящая за erlang, заключалась в том, чтобы сделать отказоустойчивую систему. Поэтому, если ошибка умирает.лет, она умирает и перезапускает ее, а не фиксирует ее. Так в случае, если процесс умирает, нам нужен ремонт, если я не ошибаюсь? –

+1

Правильно, но обычно вы хотите, чтобы вызванный/порожденный процесс умирал сам по себе и позволил разбитому ребенку просто уйти. В этом суть отказоустойчивости. Если вы используете ссылки повсюду, то вы вернетесь к тому, чтобы иметь одно гигантское пространство разломов, которое все сработает вместе, что обычно * не то, что вы хотите. Это зависит от того, какие границы вы хотите установить между элементами решения вашей проблемы. Когда вам действительно нужны ссылки за пределами супервизора, вы обычно это знаете. – zxq9

2

Ссылка двунаправленная между процессом, вызывающим функцию start_link(Name), и новым процессом, созданным gen_fsm:start_link(?MODULE, [Name], []).

Вызванная функция выполняется в контексте вызывающего процесса.

Новый процесс создается функцией spawn. Вы должны найти его в коде gen_fsm: start_link/3.

Когда ссылка создаются, если один выход процесса для другой причины, чем нормальные, связанный процесс будет умереть также, за исключением того, если он установлен process_flag(trap_exit, true) в этом случае он будет получать сообщение {'EXIT',FromPid,Reason}, где FromPid является Pid из процесс, который пришел, чтобы умереть, и причина причины прекращения.

Смежные вопросы