2016-08-11 11 views
3

모니터되는/링크 된 프로세스가 죽어가는 타이밍에 관한 질문이 있습니다. 실제로 테스트하는 방법을 생각할 수 없습니다. 다음은 내가 걱정하는 시나리오입니다.handle_call이 완료되기 전에 모니터 된 프로세스가 종료되면 어떻게됩니까?

masterslave이라는 프로세스가 있다고 가정 해 보겠습니다.

  1. master 세트 truetrap_exit.
  2. master{ok, Pid} = slave:start_link()이므로 두 개를 연결합니다.
  3. mastergen_server:call(Pid, Msg)과 같습니다.
  4. 전에 메시지가 Pid에 도착하면 프로세스가 충돌합니다.

질문 :

  1. master 먼저 EXIT 메시지를받을 수 있습니까? 또는
  2. 으로 master이 실패합니다. Pid은 이미 죽었습니까?

답변

2

실마리가 없지만 발생할 수있는 내용은 다음과 같습니다.

먼저 이해해야 할 것은 EXITmaster 사서함으로 전송되는 메시지입니다. 메시지가 아닌 master 프로세스 컨텍스트 내에서 생성되는 오류 인 noproc 오류와 대조됩니다.
이것은 두 가지를 모두 얻을 수 있음을 의미합니다. 문제는 누가 먼저 올지입니다.

EXIT 메시지가 즉시 전송되고 있기 때문에

하고 프로세스가 call이 도착하기 전에 충돌했다 있기 때문에, 당신이 먼저 EXIT 메시지를 받게됩니다 의미가 있습니다. 그들은 독립적이므로 메시지가 master 편지함에 도착하기 전에 gen_server:callnoproc 오류와 함께 반환됩니다.

구현 목적으로이 질문을하는 경우 두 경우 모두 다루는 것이 좋습니다. 나는 Erlang이 어느 것이 첫번째 일지를 약속한다고 생각하지 않는다.