【问题标题】:is OTP needed if my state does not change?如果我的状态没有改变,是否需要 OTP?
【发布时间】:2011-07-07 15:59:33
【问题描述】:

我有一个 erlang 项目,它的状态是完全只读的,由 ets 表和 compiled module 组成。代码启动时构建表需要几秒钟的时间。

打包它以便其他应用程序使用的最佳方法是什么?

需要考虑的其他事项:

  • 没有数据争用问题或更改状态,因此似乎不需要 gen_server。
  • 我喜欢能够拨打application:start/1 并让事情“正常工作”。
  • 某些进程应该拥有 ets 表。看来我不应该把它留给客户端代码。

以上内容让我认为我应该创建一个应用程序,并从主管的 init/1 函数中调用设置代码,但我不确定这是否是一种愚蠢的方法。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    将其包装为标准的 OTP 应用程序。 gen_server 不是关于维护状态,而是关于拥有一个可以处理请求的服务器(出于某种原因,它不被称为 gen_state ;))。创建一个 OTP 应用,让人们以与其他任何方式相同的方式使用它。

    【讨论】:

    • 你能想出一个不应该只是一个普通模块的无状态gen_server 的例子吗?过去我一直认为状态是使用行为的先决条件。
    【解决方案2】:

    如果模块完全是静态的,那么您在这样的应用程序中将不需要任何进程。如果您在 OTP 中实现 application 行为,您应该能够将 ETS 表直接连接到主应用程序进程(在应用程序 start/2 回调中启动表)。这样您将拥有一个最小的流程模型,允许您跳过supervisor 和任何gen_server

    您当然应该使用 OTP,但这并不意味着您绝对必须拥有 supervisorgen_server

    使用appmon 查看应用程序的进程层次结构。

    【讨论】:

    • 我喜欢!感谢您的输入。 :)
    • 我刚去做这个,发现开始回调需要返回{ok, Pid}。通常Pid 引用到最高主管进程。如果我的情况不存在,我应该返回{ok, self()}吗?
    • 是的,这是运行无监督应用程序时的做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2019-01-16
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多