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

14

阅读了乔·阿姆斯特朗(Joe Armstrong)的书和观看了凯文·史密斯(Kevin Smith)的录屏,我构建了一个简单的 OTP 应用程序,由单个 gen_server 和单个 supervisor 组成,作为一个 OTP 应用程序捆绑在一起。

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

我曾经以为,在构建 OTP 应用程序组件时,使用 gen_server 是推荐的方法。为什么 mochiweb 使用 OTP 应用程序和 supervisor 行为,但回避 gen_server 呢?

2个回答

11

您可以使用 OTP/gen_servers 来处理那些受到重启策略控制的进程 - 也就是这些进程的重启在您的掌控之中

但是对于代表与 Web 浏览器连接的进程来说,情况并非如此。如果该进程死亡,则服务器无法重新启动它 - 因此在 OTP 下运行它是没有意义的。

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


3
stdlib 应用是一个 OTP 应用程序。当启动时,它没有任何正在运行的部分。它是一个简单的库应用程序,为它所加载的模块而存在,因此其他 OTP 应用程序可以依赖它来获取它的所有模块。因此,在引入模块时仍有使用 OTP 的原因。 - Christian
你说得对,我在用语上有些草率了... 你应该按照正常的 OTP 方式将所有代码打包起来,使用目录等 - 但有时候正确的做法是直接生成一个进程,而不是使用 gen_server 来启动它。 - Gordon Guthrie

5

有一个名为mochiweb_socket_server的gen_server。生成的模块只是用于在接收到传入请求时调用gen_server的"回调模块"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接