1

我注意到发送到 gen_fsm 进程的 pid 的消息在状态回调中作为事件匹配。这只是偶然还是我可以依赖此功能?

通常我希望发送到 gen_fsm 的一般消息会显示在 handle_info/3 回调中,并认为我必须使用 gen_fsm:send_event 重新发送它。

gen_fsm 是否尝试首先将消息与状态回调匹配,然后始终与 handle_info/3 回调匹配?还是仅当它与状态回调子句不匹配时?

但是,当我尝试它时,我的消息似乎根据调试输出被处理了两次。

所以基本上这个问题也可以这样表述:如何正确处理接收到的消息作为 gen_fsm 状态函数中的事件?


澄清:对于这个问题,应该考虑通过传递消息而发生的一些事件。

我知道,在许多情况下,仅通过对 fsm 使用函数调用来使协议可见是更干净的。

我不太确定这是否会改进提到的 gen_fsm 必须适合的当前框架:不同的协议栈,其中每一层调用一个 connect() 函数来附加(有时启动)较低层。数据包通过调用函数(发送)被发送到较低层,并通过receive消息接收。很像 gen_tcp。

通过查看 gen_fsm 的代码,我已经发现一般消息仅传递给 handle_info,因此问题仍然存在,是直接从 handle_info/3 回调调用状态函数还是使用 gen_fsm:send_event 重新发送。

4

1 回答 1

1

一般消息由 handle_info 回调处理,除非您的代码中有这样的内容:

handle_info(Info, StateName, StateData) -> ?MODULE:StateName(Info, StateData)。

这避免了重新发送,但我不建议这样做,也不建议重新发送。

通过封装 send_event/sync_send_event/send_all_state_event/sync_send_all_state_event 的 API 调用专门传递事件使协议显式。这是正确的,因为使用 edoc 更容易理解、维护和记录。

于 2010-10-18T19:33:53.970 回答