【发布时间】:2011-05-09 00:28:30
【问题描述】:
如果我想在生成 gen_fsm 时始终将事件发送到它的初始状态,我应该将该函数调用放在哪里?就在 start_link 之后或从首先调用 start_link 的进程开始。这里有什么最佳做法吗?
【问题讨论】:
标签: erlang erlang-otp
如果我想在生成 gen_fsm 时始终将事件发送到它的初始状态,我应该将该函数调用放在哪里?就在 start_link 之后或从首先调用 start_link 的进程开始。这里有什么最佳做法吗?
【问题讨论】:
标签: erlang erlang-otp
如果你只是想在启动 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 是提供给 启动函数。
如果初始化成功,则 函数应该返回 {ok,StateName,StateData}, {ok,StateName,StateData,Timeout} 或 {ok,StateName,StateData,休眠}, 其中 StateName 是初始状态 name 和 StateData 初始状态 gen_fsm 的数据。
此外,使用 init 函数,您可以确定这两个函数(start_link 和 init)的原子性。他们都会成功或失败。
【讨论】:
我认为从调用 FSM 启动函数的进程发送第一个事件是正确的。或者从 init/1 返回 timeout = 0 并在初始状态下处理 'timeout' 事件。
另一方面,如果您的 gen_fsm 是一个已注册的进程,则可以进行竞争。如果是这种情况,我会在注册之前从 init/1 向 gen_fsm 进程 PID 发送消息。
【讨论】: