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