首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测erl_call断开

如何检测erl_call断开
EN

Stack Overflow用户
提问于 2012-11-15 17:30:53
回答 1查看 234关注 0票数 0

我有一个由erl_call触发的erlang服务。erl_call将进行类似于"gen_server:call(?SERVER,do,infinity)“的长调用来等待结果。如果erlang服务关闭,erl_call将返回。但是如果erl_call被中断(使用CTRL-C),erlang服务不会收到任何消息。

我和appmon和pman确认了。erl_call断开连接后,erl_call启动的进程未死。因此,到该进程链接/监视不起作用。如何检测erl_call已断开连接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-15 20:18:28

在你的handle_call函数中有第二个。参数来自::{pid(),tag()}

您可以在处理请求之前调用handle_call中的monitor(process,FromPid),以便在erl_call节点断开连接时收到关闭消息。但请注意,除非您生成一个单独的进程或对gen_server:reply()使用handle_call回复,否则您将无法在当前回复完成之前处理DOWN消息。

例如:下面是我们的handle_call子句:

代码语言:javascript
复制
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}.

接下来,我们来了解一下:

代码语言:javascript
复制
handle_info(Info, State) ->
    io:format("### Process died ~p~n", [Info]),
    {noreply, State}.

接下来,我从命令行生成测试: erl_call -c 123 -n -n -a 'gen_server call a,test,infinity‘

然后按Ctrl-C组合键

10秒后,我在gen_server控制台中看到:

代码语言:javascript
复制
### DONE            
### Process died {'DOWN',#Ref<0.0.0.41>,process,<0.44.0>,normal}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13394612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档