如何在Erlang中实现ETS状态的线程安全?

时间:2013-10-26 12:55:37

标签: erlang connection-pooling ets

我在Erlang中创建了一个连接池进程,它有子进程(每个都是一个连接)。连接池过程(管理程序)需要保持所有子进程的状态,例如指示子进程是否可以租给请求者的标志。 此状态存储在ETS表

POOL-MASTER:

  • 连接过程1
  • 连接过程2
  • 连接过程3

当客户端请求连接到POOL-MASTER时,它必须找出哪个连接过程可用于查看ETS并获取状态。此阶段称为“ get-lease ”。然后状态更新。类似地,当客户端返回到池的连接时,它使用“ return-lease ”函数来标记该项目可供下一个客户端使用。

我希望“ get-lease return-lease ”以上的功能为线程安全。换句话说,我想确保没有客户端同时使用这些函数,否则事实证明连接的状态可以混淆(两个客户端获得相同的连接)。在java中,同步方法将用于此目的。

在erlang中有什么可以实现的吗?例如,ETS表上的某种锁定机制然后重新锁定?或者是否应该创建一个单独的进程来处理要锁定/解锁的特定函数并将消息发送到此进程(假设消息传递是单线程的)?

2 个答案:

答案 0 :(得分:3)

一种方法是建立一个专门通过消息传递管理租约的流程。向该进程发送get_lease消息。它将接收租约消息,从而序列化访问,并在租约可用时向请求进程发送回复消息。承租人会向经理发送return_lease消息,该消息会将租约添加回免费列表。

经理还必须对获得租约并且无法退回的流程采取一些措施。这是一个租约,所以可能会有一个可以用于此的到期,但是如果承租人失败,经理也应该监督承租人并解除租约。

答案 1 :(得分:3)

线程安全吗?它是什么 ? Erlang不知道它:) 因为我们处理进程之间的消息传递。这确保了对任何结构的访问(由服务器erlang进程维护)将始终以序列化方式 [与Don Branson 提到的相同。]

我要做的是:

1.创建由主管进程监视的gen服务器进程。

2。此服务器进程将是您的ETS表的管理器,并公开客户端为请求和释放连接而调用的API /方法。

3。请求将由handle_call(用于同步调用)或handle_cast(用于异步调用)处理

4。您甚至可能希望通过迭代ETS表并根据某些条件从中删除来实现一些Timeout功能来释放连接

上面的工作会很好,也会给你很好的表现(如果表现出来的话)。并且没有竞争条件,因为访问被加强。