gen_fsm初始状态,在产卵时向其发送事件

时间:2010-11-12 11:12:10

标签: erlang otp

如果我想在生成gen_fsm时始终将事件发送到gen_fsm的初始状态,那么我应该在哪里放置该函数调用?在start_link之后或者从第一个调用start_link的进程开始。这里有最好的做法吗?

2 个答案:

答案 0 :(得分:5)

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

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

  

每当使用gen_fsm时   gen_fsm:start / 3,4或   gen_fsm:start_link / 3,4,这个函数   由新流程调用   初始化。

     

Args是提供给的Args参数   启动功能。

     

如果初始化成功,则   功能应该返回   【OK,Statename的,StateData}   {ok,StateName,StateData,Timeout}或   {OK,Statename的,StateData,休眠},   其中StateName是初始状态   name和StateData初始状态   gen_fsm的数据。

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

答案 1 :(得分:1)

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

另一方面,如果你的gen_fsm是一个注册过程,它可以使比赛成为可能。如果是这种情况,我会从init / 1发送消息到gen_fsm进程PID进行注册。