我在想一个有很多工人(循环接收)的Erlang程序,这些工人几乎总是在同一时间操纵他们的状态,即。大量并发,工作量太大以至于保持其在mnesia中的状态会导致性能问题,所以我想在每个循环中将状态作为args传递,然后在一段时间之后写入mnesia。这是一个好习惯吗?有一个更好的方法吗? (粗略地说,我正在寻找类似于面向对象语言中的属性的实例)
感谢。
答案 0 :(得分:0)
使用Erlang,将进程视为具有专用且有限角色的角色是一个好习惯。考虑到这一点,您将看到您将问题分成不同的类别,如:
对于每个角色,您必须决定状态信息是否必须存在于流程中。
在很多情况下,没有必要(案例1),解决方案只是将状态保持在流程的循环函数的参数中。我鼓励你看一下OTP行为,gen_server和gen_fsm是为此做的。
案例2显然操纵永久数据,这些数据必须能够在过程崩溃甚至硬件崩溃中存活。这些数据将使用dets,mnesia或任何适合您的问题的数据库存储(Redis,CouchDB ......)。
限制存储在外部数据库中的信息很重要,否则你不会受益于这个非常强大的功能,即缺乏副作用。换句话说,拥有依赖于外部信息的流程行为是一个非常糟糕的主意。