【问题标题】:OTP behaviours: gen_fsm; gen_event. Practical examples?OTP 行为:gen_fsm; gen_event。实际例子?
【发布时间】:2014-01-06 13:45:04
【问题描述】:

我已经使用了 supervisor 和 gen_server 行为,并且我可以理解它们的实际用途。但是,我不太了解 gen_fsm 和 gen_event 行为的使用。有人可以用实际例子澄清一下吗?

提前致谢

【问题讨论】:

    标签: erlang behavior erlang-otp


    【解决方案1】:

    FSM 的一个经典示例是手册中提到的超时锁定,

    根据我的经验,我实施的另一个示例是电话线,因为电话具有振铃、连接、断开等状态,并且在此状态下允许某些操作,而不允许某些操作。

    事件的一个例子是https://github.com/basho/lager中使用的日志记录

    【讨论】:

    • 谢谢。为什么大型团队会决定使用 gen_event 而不是 gen_server?
    • 来自手册,由于每个事件处理程序都是一个回调模块,因此一个事件管理器将有几个回调模块,它们是动态添加和删除的。因此 gen_event 比其他行为更能容忍回调模块错误。如果已安装事件处理程序的回调函数因原因而失败,或返回错误值 Term,则事件管理器不会失败。它将通过调用回调函数 Module:terminate/2(见下文)删除事件处理程序,分别给出参数 {error,{'EXIT',Reason}} 或 {error,Term}。不会影响其他事件处理程序。
    【解决方案2】:

    gen_fsm 是有限状态机的简洁实现,您可以做与使用 gen_server 所做的大致相同的事情,此外还可以轻松管理应用程序的不同状态(例如在游戏服务器中选择一个关卡,一个表,修改播放器属性,播放,保存,恢复...)。

    gen-event 是一种派发事件的简单方法,您的应用程序将所有事件发送到 gen_event 对潜在用途一无所知,并且您可以动态添加和删除具有不同行为的处理程序(登录文件、数据库、显示信息在图形界面中...)。我已经使用它来获得我的应用程序的进程状态和通信的图形视图,以及用于性能分析的文件日志。

    【讨论】:

      【解决方案3】:

      你可以在这里找到一些很好的例子:

      Event handlers”和“Finite State Machines

      gen_fsm:

      gen_fsm 的行为有点类似于 gen_server,因为它是 它的一个专门版本。最大的不同是 除了处理调用和强制转换,我们正在处理同步和 异步事件。就像我们的狗和猫的例子一样,每个州都是 用函数表示。再次,我们将通过我们的回调 模块需要实现才能工作。

      gen_event:

      gen_event 的行为与 gen_server 和 gen_fsm 行为,因为你从来没有真正开始一个过程。 gen_event 行为基本上运行接受和 调用函数,并且您只提供具有这些函数的模块。 也就是说,你与事件无关 操作,除了给你的回调函数的格式是 取悦活动经理。所有管理都是免费的;只有你 提供特定于您的应用程序的内容。这不是真的 令人惊讶的是,OTP 再次是关于分离通用的 从具体的。

      【讨论】:

        猜你喜欢
        • 2010-12-21
        • 1970-01-01
        • 2016-10-27
        • 2011-04-13
        • 2013-06-07
        • 2013-07-12
        • 2017-10-17
        • 1970-01-01
        • 2011-04-15
        相关资源
        最近更新 更多