Erlang gen_server vs无状态模块

3 erlang erlang-otp

我最近完成了Joe的书,非常喜欢它.从那时起我开始使用erlang编写一个软实时应用程序,我不得不说我对gen_server的使用有点困惑.

我什么时候应该使用gen_server而不是简单的无状态模块?我定义了一个无状态模块如下: - 一个模块,它将状态作为参数(非常类似于ETS/DETS)而不是在内部保存(如gen_server)

比如一个发票经理类型模块,它应该初始化并返回我随后传递给它的状态吗?SomeState = InvoiceManager:Init(),SomeState = InvoiceManager:AddInvoice(SomeState,AnInvoiceFoo).

假设我需要发票管理器状态的多个实例(比如我的应用程序管理多个公司,每个都有自己的发票),如果他们每个都有一个内部状态的gen_server来管理他们的发票,或者它更适合简单地拥有无状态模块以上?

两者之间的界限在哪里?

(注意上面的发票管理示例只是一个例子来说明我的问题)

rvi*_*ing 8

我真的不认为你可以区分你所谓的无状态模块和gen_server.在这两种情况下都有一个递归的接收循环,它在至少一个参数中携带状态.这个主循环处理请求,根据请求工作,并在必要时将结果发送回请求者.主循环很可能也会处理许多管理请求,这些请求可能不是主API /协议的一部分.

不同之处在于gen_server抽象出主接收循环并允许用户仅写入实际的用户代码.它还将为您处理许多管理OTP功能.主要区别在于用户代码位于另一个模块中,这意味着您可以更轻松地查看传递状态.除非你真的设法在一个大的接收循环中编写代码而不调用其他函数来完成工作,否则没有真正的区别.

哪种方法更好取决于您的需求.使用gen_server将简化您的代码并为您提供"免费"的附加功能,但它可能更具限制性.滚动你自己会给你更多的力量,但你也提供更多的可能性来搞砸了.它可能也快一点.你需要什么?