何时在 Erlang/OTP 应用程序中使用 gen_server

Posted

技术标签:

【中文标题】何时在 Erlang/OTP 应用程序中使用 gen_server【英文标题】:When to use gen_server in Erlang/OTP applications 【发布时间】: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?

【问题讨论】:

【参考方案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 来启动它。

以上是关于何时在 Erlang/OTP 应用程序中使用 gen_server的主要内容,如果未能解决你的问题,请参考以下文章

Erlang/OTP 生产应用部署简介

初学者的 Erlang/OTP 行为

Erlang/OTP - 计时应用

您如何设计基于Erlang / OTP的分布式容错多核系统的架构?

使用 OTP/Erlang 作为 Web 应用程序基于组件的架构的一部分

如何在 Erlang/OTP 中使用 application:get_env()?