1

如果我想在生成它时始终将事件发送到 gen_fsm 的初始状态,我应该在哪里调用该函数?就在 start_link 之后或从首先调用 start_link 的进程开始。这里有什么最佳实践吗?

4

2 回答 2

5

如果你只是想在启动 FSM 后改变它的状态,你可以简单地为你的状态机实现 init 函数:

阅读自:http ://www.erlang.org/doc/man/gen_fsm.html#Module:init-1

每当使用 gen_fsm:start/3,4 或 gen_fsm:start_link/3,4 启动 gen_fsm 时,新进程都会调用此函数进行初始化。

Args 是提供给 start 函数的 Args 参数。

如果初始化成功,函数应该返回 {ok,StateName,StateData}, {ok,StateName,StateData,Timeout} 或 {ok,StateName,StateData,hibernate},其中 StateName 是初始状态名称,StateData 是初始状态数据gen_fsm 的。

此外,使用 init 函数,您可以确定这两个函数(start_link 和 init)的原子性。他们都会成功或失败。

于 2010-11-12T11:44:34.393 回答
1

我认为从调用 FSM 启动函数的进程发送第一个事件是正确的。或者从 init/1 返回 timeout = 0 并在初始状态下处理 'timeout' 事件。

另一方面,如果您的 gen_fsm 是一个已注册的进程,则可以进行比赛。如果是这种情况,我会在注册之前从 init/1 向 gen_fsm 进程 PID 发送消息。

于 2010-11-12T11:52:56.037 回答