应该实施哪些行为?

时间:2014-10-31 10:21:30

标签: erlang otp

因此,我们拥有通用部分和特定部分,这要归功于erlang / OTP行为,这极大地简化了我们的代码,并为我们提供了一个人人都能理解的通用框架。

我是一名Erlang新手,并试图了解OTP的概念。 但其中

  • gen_server
  • 的gen_fsm
  • gen_event

哪种行为适合哪种应用。

我提出这个问题的原因是因为经过一些冗长的理论后,我仍然不确定哪个更适合XYZ应用。

是否有任何标准或经验法则,或者只是程序员本能在这种情况下重要? 有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

备注,这是一个非常普遍的问题,不适合这个社区的使用。

主管可以控制您的应用程序启动和发展的方式。 它以正确的顺序启动流程,验证一切正常,在发生故障时管理重启策略,流程池,监督树......优点是它可以帮助您遵循"让它碰撞"在您的应用程序中规则,它集中在几行代码中,以协调您的所有流程。

我主要使用gen_event进行日志记录。您可以使用此行为根据您的目标按需连接不同的处理程序。在我的一个应用程序中,默认情况下,我有一个允许一目了然地检查行为的图形记录器,以及一个允许更深入和事后分析的文本文件处理程序。

Gen_server是所有应用程序的基本块。它允许保持状态,通话,演员甚至简单消息。它管理代码更改并提供启动和停止功能。我的大多数模块都是gen_servers,您可以将其视为负责执行单个任务的actor。

Gen_fsm为gen服务器提供具有特定行为的当前状态的概念,以及从状态到状态的转换。它可以用于例如游戏中控制游戏的进化(配置,等待玩家,游戏,改变等级......)

创建应用程序时,您将识别您必须执行的不同任务,并将它们分配给gen_server gen_fsm。您将添加gen_event以允许发布/订阅机制。然后,您将必须考虑其依赖性和错误恢复来对所有进程进行分组。这将为您提供监督树和重启策略。

答案 1 :(得分:0)

我使用以下规则。

  • 如果您有一个以请求 - 响应方式为多个客户提供服务的长生命实体 - 您使用gen_server
  • 如果这个长期存在的实体应该支持更复杂的请求/响应协议,那么最好使用gen_fsm。例如,我喜欢使用gen_fsm来实现网络协议。
  • 如果您需要一些抽象事件总线,任何进程可以发布消息,并且任何客户端可能希望接收此消息,您需要gen_event
  • 如果您有一些必须重新启动的程序(例如,如果其中一个失败),您应该将此过程置于主管下,这将这些过程联系在一起。