【问题标题】:When to use gen_server in Erlang/OTP applications何时在 Erlang/OTP 应用程序中使用 gen_server
【发布时间】:2010-11-24 10:59:13
【问题描述】:

阅读了 Joe Armstrong 的书并观看了 Kevin Smith 的截屏视频后,我构建了一个简单的 OTP 应用程序,该应用程序由一个 gen_server 和一个主管组成,捆绑在一起作为一个 OTP 应用程序。

现在我正在查看 mochiweb 并使用 new_mochiweb.erl 脚本创建了一个示例项目 [helloworld]。浏览源代码我发现它与我的示例 OTP 应用程序 [OTP 应用程序在那里,主管在那里] 没有什么不同,但有一个关键区别.. 生成的 helloworld.erl 和 helloworld_web.erl 文件没有实现 gen_server 行为,它们只是标准的 Erlang 模块。

我的印象是,在构建 OTP 应用程序组件时,推荐使用 gen_server。为什么 mochiweb 可能会使用 OTP 应用程序和主管行为而避开 gen_server?

【问题讨论】:

    标签: erlang erlang-otp mochiweb


    【解决方案1】:

    有一个gen_server,叫做mochiweb_socket_server。生成的模块只是 gen_server 在接收传入请求时调用的“回调模块”。

    【讨论】:

      【解决方案2】:

      您将 OTP/gen_servers 用于处于重启策略下的进程 - 即重启由您控制

      表示与 Web 浏览器的连接的进程并非如此。如果该进程终止,服务器将无法重新启动它 - 因此在 OTP 下运行它是没有意义的。

      Mochiweb(和 Yaws)都使用 gen_servers 绑定到侦听端口,然后生成一个无监督进程来处理新连接。

      【讨论】:

      • stdlib 应用程序是一个 OTP 应用程序。启动时,它没有任何运行部件。它是一个普通的库应用程序,用于加载它的模块,因此其他 OTP 应用程序可以依赖它来获取它的所有模块。因此,在引入模块时仍然有理由使用 OTP。
      • 你的权利,我的语言有点草率......你应该使用目录和东西以正常的 OTP 方式打包你的所有代码 - 但有时正确的做法是生成一些东西,而不是使用 gen_server 来启动它。
      猜你喜欢
      • 2011-07-13
      • 2011-05-24
      • 2011-02-06
      • 2011-05-18
      • 2012-10-11
      • 2015-12-14
      • 2016-04-03
      • 2012-08-01
      • 2017-01-13
      相关资源
      最近更新 更多