handle_call 함수에는 두 번째가 있습니다. argument From :: {pid(), tag()}
요청을 처리하기 전에 handle_call에서 monitor (process, FromPid)를 호출하면 erl_call 노드의 연결이 끊어지면 DOWN 메시지가 표시됩니다. 그러나 별도의 프로세스를 생성하거나 지연된 응답을 gen_server : reply()로 사용하지 않는 한 현재 handle_call이 완료되기 전에 DOWN 메시지를 처리 할 수 없습니다.
예를 들어
: 여기에 우리의 handle_call 절입니다 :
handle_call(test, {From, _}=X, State) ->
erlang:monitor(process, From),
spawn(fun() ->
timer:sleep(10000),
io:format("### DONE~n", []),
gen_server:reply(X, ok) end),
{noreply, State}.
다음으로 우리는 아래로 잡아 : 나는 명령 줄에서 erl_call 산란
handle_info(Info, State) ->
io:format("### Process died ~p~n", [Info]),
{noreply, State}.
다음 : erl_call -n 123 -c 테스트 -a ' gen_server call [a, test, infinity] '
히트 Ctrl-C
10 초 후에 gen_server 콘솔에서 보았습니다.
### DONE
### Process died {'DOWN',#Ref<0.0.0.41>,process,<0.44.0>,normal}
안녕하세요, 답장을 보내 주셔서 감사합니다. 지연 응답을 사용하고 erl_call을 대기 상태로 유지합니다. 나는 링크/모니터를 사용해보십시오. 그러나 그것은 효과가 없습니다. pman을 사용하면 어떤 프로세스가 결과를 기다리고 있는지 알 수 있습니다. 중단 된 erl_call 이후 프로세스가 여전히 작동하므로 EXIT/DOWN 메시지가 표시되지 않습니다. – shian
음, 지연된 통화가 완료되면 결국 DOWN 메시지가 수신됩니다. 방금 확인했는데 실제로 작동합니다. –
답변을 업데이트했습니다 –