何时使用Gen_Fsm和何时使用Gen_Server?

10

在查看了 Gen_Fsm 和 Gen_Server 的文档之后,我发现它们的行为有些相似。据我所知,如果存在一个循环函数用于发送广播或监听 TCP socket,则最好使用 Gen_Fsm,否则使用 gen_server。我想知道这是否正确?

1个回答

9

你已经注意到gen_servergen_fsm在功能上非常相似。

但是在大多数程序中,使用gen_server的情况要比使用gen_fsm更多。

我认为只有在使用100%符合gen_fsm模型时,gen_fsm才有用。因此,必须有一个简单明了的有限状态机与您的问题相匹配。请注意,通常情况下,有限状态机的状态计数会随着现实世界而不断增加。

如果您发现在gen_fsmState变量中有大量的次要状态信息,则可能是时候切换到gen_server并将gen_fsm的状态添加到State变量中了。

一般来说,如果不确定,就使用gen_server

两者的一个缺点是无法使用选择性接收(在gen_fsm中表现得更糟),而选择性接收是减少实际应用程序中状态机复杂性的重要工具。

为了同时具有选择性接收和OTP行为的优点,我建议使用plain_fsm


你说:“……你不能使用有选择的接收。”为什么?我认为只要我们不触及那些我们不感兴趣的消息,比如 $gen_blah_blah 和系统消息,我们就没问题。如果我们可以控制传入消息的格式,我们就只能接收那些我们感兴趣的消息,像这样 receive {some_app_specific_message_tag, Msg} -> ... - Not an ID
@NotanID,你将不得不在handle_info中自己实现选择性接收,并且无法使用gen_server:call|cast。此时,plain_fsm是更好的选择。 - lud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接