【问题标题】:which behaviour should be implemented?应该执行哪些行为?
【发布时间】:2014-12-27 15:14:36
【问题描述】:

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

我是一名 Erlang 新手,正在努力理解 OTP 的概念。 但是在

  • gen_server
  • gen_fsm
  • gen_event
  • 主管

哪种行为适合哪种应用。

我之所以问这个问题是因为在经历了一些冗长的理论之后,我仍然不确定哪个更适合 XYZ 应用程序。

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

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    我使用以下规则。

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

    【讨论】:

      【解决方案2】:

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

      主管在这里控制您的应用程序启动和及时发展的方式。 它以正确的顺序启动进程并验证一切正常,管理失败时的重启策略,进程池,监督树......优点是它可以帮助您遵循“让它崩溃”规则在您的应用程序中,它将复杂的任务集中在几行代码中以协调您的所有流程。

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

      Gen_server 是所有应用程序的基础。它允许保持状态、响应呼叫、投射甚至是简单的消息。它管理代码更改并提供启动和停止功能。我的大部分模块都是 gen_servers,你可以把它看成是负责执行单个任务的 actor。

      Gen_fsm 为生成服务器带来了具有特定行为的当前状态的概念,以及从一个状态到另一个状态的转换。例如可以在游戏中使用它来控制游戏的进化(配置、等待玩家、玩游戏、改变关卡……)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-09
        • 2012-12-20
        • 1970-01-01
        相关资源
        最近更新 更多