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

如何在Erlang中实现ETS状态的线程安全?,erlang,connection-pooling,ets,Erlang,Connection Pooling,Ets,我在Erlang中创建了一个连接池进程,该进程具有子进程(每个子进程都是一个连接)。连接池进程(supervisor)需要保存所有子进程的状态,例如一个标志,指示子进程是否可以出租给请求者此状态存储在ETS表中 主池: 连接过程1 连接过程2 连接过程3 当客户机请求连接到POOL-MASTER时,它必须通过查看ETS和获取状态来确定哪个连接进程可用。此阶段称为“获取租赁”。然后更新状态。类似地,当客户机返回到池的连接时,它使用一个“返回租约””函数,该函数将该项目标记为可供下一个客户机使用

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

主池:

  • 连接过程1
  • 连接过程2
  • 连接过程3
当客户机请求连接到POOL-MASTER时,它必须通过查看ETS和获取状态来确定哪个连接进程可用。此阶段称为“获取租赁”。然后更新状态。类似地,当客户机返回到池的连接时,它使用一个“返回租约””函数,该函数将该项目标记为可供下一个客户机使用

我希望上面的函数“获取租约返回租约”是线程安全的。换句话说,我想确保没有客户端同时使用这些函数,否则连接的状态可能会混淆(两个客户端获得相同的连接)。在java中,一个同步方法将用于此目的


在erlang中有什么可以做到这一点的吗?例如,ETS表上的某种锁定机制,然后重新锁定?还是应该创建一个处理要锁定/解锁的特定功能并向该流程发送消息的单个流程(假设消息是单线程的)?

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


经理还必须对获得租赁但未能归还的流程采取措施。这是一份租约,因此可能会有一个到期日,但经理可能也应该监控承租人,并在承租人失败时解除租约。

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

我会做的是: 1.创建由主管进程监视的gen server进程。

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

三,。请求将由handle_调用(对于同步调用)或handle_cast(对于异步调用)处理

四,。您甚至可能想要实现一些超时功能,通过迭代ETS表并根据某些条件从表中删除来释放连接

上述方法也可以很好地为您提供良好的性能(如果您想到性能的话)。由于访问是串行化的,因此没有竞争条件。

正如答案已经指出的那样,ETS在设计上没有或非常有限的事务处理。如果需要事务,则需要将ETS访问封装在一个进程中。这是否意味着两个同时调用同一函数mymodule:myfunc(x)的并发进程“a”和“B”将实际排队,并由myfunc(x)一次为一个进程提供服务?是的,如果“mymodule”是一个genserver。同样可以,如果“mymodule”中的“myfunc”是一个简单的函数,执行“接收”和“发送(!)”