我在Erlang中创建了一个连接池进程,它有子进程(每个都是一个连接)。连接池过程(管理程序)需要保持所有子进程的状态,例如指示子进程是否可以租给请求者的标志。 此状态存储在ETS表。
POOL-MASTER:
当客户端请求连接到POOL-MASTER时,它必须找出哪个连接过程可用于查看ETS并获取状态。此阶段称为“ get-lease ”。然后状态更新。类似地,当客户端返回到池的连接时,它使用“ return-lease ”函数来标记该项目可供下一个客户端使用。
我希望“ get-lease 和 return-lease ”以上的功能为线程安全。换句话说,我想确保没有客户端同时使用这些函数,否则事实证明连接的状态可以混淆(两个客户端获得相同的连接)。在java中,同步方法将用于此目的。
在erlang中有什么可以实现的吗?例如,ETS表上的某种锁定机制然后重新锁定?或者是否应该创建一个单独的进程来处理要锁定/解锁的特定函数并将消息发送到此进程(假设消息传递是单线程的)?
答案 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功能来释放连接
上面的工作会很好,也会给你很好的表现(如果表现出来的话)。并且没有竞争条件,因为访问被加强。