2011-06-01 30 views
10

检查Gen_Fsm和Gen_Server文档后,我发现或多或少,它们的行为类似。在我看来,如果有一个循环函数用于发送广播或监听tcp sock,最好使用Gen_Fsm,否则使用gen_server。我想知道它是否正确?何时使用Gen_Fsm以及何时使用Gen_Server?

回答

9

你已经看到正确的gen_servergen_fsm功能非常相似。

但是在大多数程序中有更多gen_servergen_fsm的用法。

在我看来,gen_fsm仅当使用率100%适合gen_fsm模型时才有用。所以必须有一个简单明了的有限状态机来适应你的问题。请注意,通常情况下,密克罗尼西亚联邦的国家数量在面对现实世界时会发生爆炸。

如果你发现自己有很多的辅助状态信息gen_fsmState可变它可能是时间切换到gen_server并添加gen_fsm的状态到State变量。

一般当有疑问:同时使用gen_servergen_fsmgen_server

一个缺点(它出来,在gen_fsm通常更糟)是你不能使用选择性接收。选择性接收是降低实际应用中状态机复杂度的重要工具。

为了兼顾选择性接收和OTP行为,我推荐使用plain_fsm

+0

你说:“......你不能使用选择性接收。”,这是为什么?我认为,只要我们不触及那些我们不感兴趣的消息,比如'$ gen_blah_blah'和系统消息,我们都很好。如果我们可以控制传入消息的格式,那么我们只能接收到我们感兴趣的内容,比如'receive {some_app_specific_message_tag,Msg} - > ...' – 2016-09-18 06:25:56

+0

@NotanID那么您将不得不在'handle_info' ,并且不能使用'gen_server:call | cas​​t'。此时,plain_fsm是更好的选择。 – niahoo 2017-02-02 09:27:15

相关问题