何时在 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的分布式容错多核系统的架构?