首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在发送消息时确保gen_fsm/gen_server进程存在

在发送消息时确保gen_fsm/gen_server进程存在
EN

Stack Overflow用户
提问于 2013-07-23 16:14:21
回答 2查看 255关注 0票数 1

在Erlang中,最推荐的方法是在向其发送消息/事件之前确保存在某个进程?在我的场景中,我是在消息第一次出现时开始处理的,然后它仍然是活动的。在继续传递更多消息的同时,我首先尝试以相同的名称启动流程,以确保它已经启动,如下所示(使用gen_fsmsimple-one-for-one重新启动场景):

代码语言:javascript
复制
%% DeviceId - process name

heartbeat(ApplicationKey, DeviceId, Timeout) ->
    ensure_session_started(ApplicationKey, DeviceId, Timeout),
    gen_fsm:send_event(DeviceId, {heartbeat, Timeout}).

ensure_session_started(ApplicationKey, DeviceId, Timeout) ->
    case session_server_sup:start_child(ApplicationKey, DeviceId, Timeout) of
        {ok, _Pid} -> {ok, running};
        {error, {already_started, _}} -> {ok, running};
        {error, Error} -> erlang:throw({error, {failed_to_start_session, Error}})
    end.

我相信这个解决方案并不完美,而且可能有一些开销,但我仍然认为它比使用erlang:is_process_alive更容易发生竞争。我说的对吗?有什么办法改进吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-23 18:43:49

您是对的,erlang: is _process_alive/1方法在这种情况下是无用的,因为存在竞争条件。

你的例子是可行的,我在野外见过几次。请注意,它不能保证消息将被处理。为了确保这一点,你需要监控你的接收器,并从它得到确认。这是如何在gen_server:call/2中完成的。

票数 4
EN

Stack Overflow用户

发布于 2013-07-24 07:32:24

使用活动/2,3,您可以将事件发送到FSM并等待响应。因此,您可以告诉您的调用进程,它的消息已经收到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17815528

复制
相关文章

相似问题

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