在你的handle_call函數中有第二個。參數來自:: {pid(),tag()}
在處理請求之前,您可以在handle_call中調用monitor(process,FromPid),以便在erl_call節點斷開連接時收到DOWN消息。但請注意,在當前handle_call完成之前,您將無法處理DOWN消息,除非您生成單獨的進程或使用gen_server:reply()的延遲迴復。
例如:這裏是我們的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}.
接下來我們趕上DOWN:
接下來,我在命令行erl_call產卵: erl_call -c 123 -n測試-a「 gen_server呼叫[a,test,infinity]'
and hit 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消息。我剛剛檢查過,確實有效。 – 2012-11-15 14:27:15
我已經更新了答案 – 2012-11-15 14:33:52