Erlang 确保发送消息时gen_fsm/gen_服务器进程存在

Erlang 确保发送消息时gen_fsm/gen_服务器进程存在,erlang,otp,message-passing,gen-server,gen-fsm,Erlang,Otp,Message Passing,Gen Server,Gen Fsm,在Erlang中,在向某个进程发送消息/事件之前,最推荐的确保该进程存在的方法是什么?在我的场景中,我在消息第一次出现时启动进程,然后它保持活动状态。在继续传递更多消息的同时,我首先尝试使用相同的名称启动流程,以确保它已启动,类似这样(使用gen_fsm和简单的一对一重启场景): 我相信这个解决方案并不完美,可能会有一些开销,但仍然相信它比使用erlang:is\u process\u alive更不容易出现争用情况。我说得对吗?有什么想法可以改进吗?你说得对,erlang:is\u proce

在Erlang中,在向某个进程发送消息/事件之前,最推荐的确保该进程存在的方法是什么?在我的场景中,我在消息第一次出现时启动进程,然后它保持活动状态。在继续传递更多消息的同时,我首先尝试使用相同的名称启动流程,以确保它已启动,类似这样(使用
gen_fsm
简单的一对一
重启场景):


我相信这个解决方案并不完美,可能会有一些开销,但仍然相信它比使用
erlang:is\u process\u alive
更不容易出现争用情况。我说得对吗?有什么想法可以改进吗?

你说得对,erlang:is\u process\u alive/1由于竞争条件,这种方法在这种情况下是无用的


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

您是对的,erlang:is_process\u alive/1方法在这种情况下是无用的,因为竞争条件

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

使用,您可以向FSM发送事件并等待响应。因此,您可以告诉您的呼叫进程已收到其消息。

使用,您可以向FSM发送事件并等待响应。因此,您可以告诉您的呼叫进程,它的消息已被接收

%% 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.