Erlang 检察官办公室行为:gen_fsm;gen_事件。实例?

Erlang 检察官办公室行为:gen_fsm;gen_事件。实例?,erlang,behavior,otp,Erlang,Behavior,Otp,我已经使用过supervisor和gen_服务器行为,我能够理解它们的实际用途。然而,我并不真正了解gen_fsm的使用和gen_事件行为。有人能举例说明吗 提前感谢FSM的一个经典示例是手册中提到的带超时的锁定 根据我的经验,我实现的另一个例子是电话线,因为电话有振铃、连接、断开等状态,在这些状态下,有些操作是允许的,有些是不允许的 gen_fsm是有限状态机的一个简洁实现,您可以执行与gen_服务器大致相同的操作,此外还可以轻松管理应用程序的不同状态(例如,在游戏服务器中选择关卡、表格、修改

我已经使用过supervisor和gen_服务器行为,我能够理解它们的实际用途。然而,我并不真正了解gen_fsm的使用和gen_事件行为。有人能举例说明吗


提前感谢

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

根据我的经验,我实现的另一个例子是电话线,因为电话有振铃、连接、断开等状态,在这些状态下,有些操作是允许的,有些是不允许的


gen_fsm是有限状态机的一个简洁实现,您可以执行与gen_服务器大致相同的操作,此外还可以轻松管理应用程序的不同状态(例如,在游戏服务器中选择关卡、表格、修改玩家属性、播放、保存、还原…)


gen事件是一种简单的事件分发方法,您的应用程序将所有事件发送到gen_事件,而不知道潜在用途,您可以使用不同的行为(登录文件、数据库、在图形界面中显示信息……)动态添加和删除处理程序。我已经使用它以图形方式查看了应用程序的进程状态和通信,以及用于性能分析的文件日志

这里有一些很好的例子:

“”和“”

通用金融服务管理公司:

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

gen_事件:

gen_事件行为与gen_服务器和 gen_fsm的行为是,您从未真正开始流程。 gen_事件行为基本上运行接受和 调用函数,并且只提供具有这些函数的模块。 这就是说,你们和事件无关 操作,除了以 让活动经理高兴。所有的管理都是免费的;只有你 提供特定于您的应用程序的内容。这不是真的 令人惊讶的是,鉴于OTP,再次,所有关于区分什么是通用的 从具体的角度来看


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