如何在Erlang中实现状态?

如何在Erlang中实现状态?,erlang,Erlang,我认为一个Erlang程序有很多工人(loop receive),这些工人几乎总是在同一时间操纵他们的状态,也就是说,大量并发,工人数量如此之大,以至于将他们的状态保留在mnesia中会导致性能问题,所以我认为在每个循环中将状态传递为args,然后再过一段时间写信给mnesia。这是一种好的做法吗?有更好的方法吗?(粗略地说,我正在寻找一个类似于面向对象语言中具有属性的实例的东西) 谢谢。对于Erlang,将流程视为具有专用和有限角色的参与者是一个好习惯。记住这一点,您将看到您将问题分为不同类别

我认为一个Erlang程序有很多工人(loop receive),这些工人几乎总是在同一时间操纵他们的状态,也就是说,大量并发,工人数量如此之大,以至于将他们的状态保留在mnesia中会导致性能问题,所以我认为在每个循环中将状态传递为args,然后再过一段时间写信给mnesia。这是一种好的做法吗?有更好的方法吗?(粗略地说,我正在寻找一个类似于面向对象语言中具有属性的实例的东西)


谢谢。

对于Erlang,将流程视为具有专用和有限角色的参与者是一个好习惯。记住这一点,您将看到您将问题分为不同类别,如:

  • 通过Internet维护与用户的连接状态
  • 保留登录名、用户档案、好友、购物车等信息
  • 记录事件
  • 对于每个角色,您必须决定状态信息是否必须保留到流程中

    在很多情况下,这是不必要的(情况1),解决方案只是将状态保持在流程的循环函数的参数中。我鼓励您查看OTP行为,gen_服务器和gen_fsm就是为此而设计的

    案例2显然操纵的是永久性数据,这些数据必须在进程崩溃甚至硬件崩溃时仍然存在。这些数据将使用dets、mnesia或任何适合您的问题的数据库(Redis、CouchDB…)存储


    重要的是要限制存储到外部数据库中的信息,否则您将无法受益于这个非常强大的功能,即没有副作用。换句话说,拥有依赖于外部信息的过程行为是一个非常糟糕的想法

    如果不知道您的程序实际要解决什么问题,就不可能回答这个问题。通常,大多数具有进程的Erlang程序,只有来自其他进程的服务请求才知道自己的状态,并且状态以参数形式传递给递归循环。