在查看了 Gen_Fsm 和 Gen_Server 的文档之后,我发现它们的行为有些相似。据我所知,如果存在一个循环函数用于发送广播或监听 TCP socket,则最好使用 Gen_Fsm,否则使用 gen_server。我想知道这是否正确?
在查看了 Gen_Fsm 和 Gen_Server 的文档之后,我发现它们的行为有些相似。据我所知,如果存在一个循环函数用于发送广播或监听 TCP socket,则最好使用 Gen_Fsm,否则使用 gen_server。我想知道这是否正确?
你已经注意到gen_server
和gen_fsm
在功能上非常相似。
但是在大多数程序中,使用gen_server
的情况要比使用gen_fsm
更多。
我认为只有在使用100%符合gen_fsm
模型时,gen_fsm
才有用。因此,必须有一个简单明了的有限状态机与您的问题相匹配。请注意,通常情况下,有限状态机的状态计数会随着现实世界而不断增加。
如果您发现在gen_fsm
的State
变量中有大量的次要状态信息,则可能是时候切换到gen_server
并将gen_fsm
的状态添加到State
变量中了。
一般来说,如果不确定,就使用gen_server
两者的一个缺点是无法使用选择性接收(在gen_fsm
中表现得更糟),而选择性接收是减少实际应用程序中状态机复杂性的重要工具。
为了同时具有选择性接收和OTP行为的优点,我建议使用plain_fsm。
$gen_blah_blah
和系统消息,我们就没问题。如果我们可以控制传入消息的格式,我们就只能接收那些我们感兴趣的消息,像这样receive {some_app_specific_message_tag, Msg} -> ...
- Not an IDhandle_info
中自己实现选择性接收,并且无法使用gen_server:call|cast
。此时,plain_fsm是更好的选择。 - lud