- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Erlang 中创建了一个连接池进程,它有子进程(每个进程都是一个连接)。连接池进程(管理程序)需要保存所有子子进程的状态,例如指示子进程是否可租用给请求者的标志。 此状态存储在 ETS 表中。
池大师:
当客户端请求连接到 POOL-MASTER 时,它必须通过查看 ETS 并获取状态来找出可用的连接进程。此阶段称为“获取租约”。然后状态被更新。类似地,当客户端将连接返回到池时,它使用“return-lease”函数来标记该项目可供下一个客户端使用。
我希望“get-lease”和return-lease”上面的函数是线程安全的。换句话说,我想确保没有客户端同时使用这些函数,否则连接的状态可能会混合(两个客户端获得相同的连接)。在java中,同步方法将用于此目的。
erlang 中有什么可以实现这一点吗?例如 ETS 表上的某种锁定机制然后释放锁?或者应该创建一个处理要锁定/解锁的特定功能并向该进程发送消息的单个进程(假设消息传递是单线程的)?
最佳答案
线程安全?它是什么 ? Erlang 不知道这一点:) 因为我们致力于进程之间的消息传递。这确保了对任何结构(由服务器 erlang 进程维护)的访问始终以序列化方式 [与 Don Branson 提到的相同。]
我会做的是:
1. 创建一个由supervisor进程监控的gen服务器进程。
2.该服务器进程将是您的 ETS 表的管理器,并公开供客户端调用的 API/方法,以请求和释放连接。
3.请求将由handle_call(对于同步调用)或handle_cast(对于异步调用)处理
4.您甚至可能想要实现一些超时功能,通过迭代 ETS 表并根据某些条件从中删除来释放连接
上面的方法也可以很好地为您提供不错的性能(如果您想到性能的话)。并且当访问被序列化时没有竞争条件。
关于erlang - 如何在Erlang中实现ETS状态的线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606977/
我是一名优秀的程序员,十分优秀!