イベントを生成したときに常にイベントをgen_fsmの初期状態に送信したい場合、その関数呼び出しをどこに置く必要がありますか?start_linkの直後、または最初にstart_linkを呼び出したプロセスから。ここにベストプラクティスはありますか?
2 に答える
起動後に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は、start関数に提供されるArgs引数です。
初期化が成功した場合、関数は{ok、StateName、StateData}、{ok、StateName、StateData、Timeout}または{ok、StateName、StateData、hibernate}を返す必要があります。ここで、StateNameは初期状態名、StateDataは初期状態データです。 gen_fsmの。
また、init関数を使用すると、2つの関数(start_linkとinit)のアトミック性を確認できます。それらは両方とも成功または失敗します。
FSM開始関数を呼び出すプロセスから最初のイベントを送信するのは正しいと思います。または、init/1からtimeout=0を返し、初期状態で「timeout」イベントを処理します。
一方、gen_fsmが登録されたプロセスである場合は、レースが可能になります。その場合は、登録する前に、init/1からgen_fsmプロセスPIDにメッセージを送信します。