Erlang ETS表事件

Erlang ETS表事件,erlang,blocking,mnesia,ets,Erlang,Blocking,Mnesia,Ets,如果我想将ETS表用于共享状态,是否存在等待插入ETS表的既定机制 我知道mnesia支持表事件,我在想一个类似的机制对于普通ETS是有用的,这样一个进程就可以等待它需要的数据被加载。我认为实现这一点的唯一方法是旋转循环并不断请求给定的密钥,直到它到达,但这似乎效率很低。我宁愿收到回电。如果我在我的和ETS之间插入一个进程,我就把问题推到了底线 ETS没有事件的概念 但是,您可以通过将读卡器进程放入“receive”子句中,然后让写卡器进程在加载数据后向读卡器发送消息来实现上述目的。最简单的解决

如果我想将ETS表用于共享状态,是否存在等待插入ETS表的既定机制


我知道mnesia支持表事件,我在想一个类似的机制对于普通ETS是有用的,这样一个进程就可以等待它需要的数据被加载。我认为实现这一点的唯一方法是旋转循环并不断请求给定的密钥,直到它到达,但这似乎效率很低。我宁愿收到回电。如果我在我的和ETS之间插入一个进程,我就把问题推到了底线

ETS没有事件的概念


但是,您可以通过将读卡器进程放入“receive”子句中,然后让写卡器进程在加载数据后向读卡器发送消息来实现上述目的。

最简单的解决方法是启动gen_server进程并通过它代理所有插入请求。然后,您可以通过将回调保持在gen_服务器状态来注册回调,并在插入的密钥与模式匹配时调用回调。它甚至可以在一个单独的应用程序中运行,以允许一个专用的监控程序。

ets中没有事件处理。这是一个相当低级的语言特性,由您自己来包装它。顺便说一句,这是mnesia的做法。因此,您可以将共享状态包装到一个模块中,然后进行订阅并发送自己。

这只是将问题推到了最后,因为编写器进程必须知道未来的其他读者关心哪一个,即事件订阅。对于我的用例,我不认为这是非常有效的。我想培养一批工人,其中一些人可能需要等待其他工人完成他们的部分处理后才能开始。没有一种明显的方法可以在不序列化所涉及的工作的情况下预先确定这种关系。对不起,从您的问题中不清楚您有很多员工。在这种情况下,你是对的,我所建议的不是最好的解决方案。看起来你最好的选择是在它周围写一个包装器。我希望有一个比直接使用ETS更快的方法,注册另一层间接寻址和序列化是不幸的。不过,我要指出这个答案是正确的,因为这确实是ETS唯一可行的方法。这正是Mnesia所做的,加上许多其他东西,这就是它效率较低的原因。ETS的大多数用法不需要您想要的内容—插入每个密钥的通知。作为一名开发人员,我更喜欢ETS的精简和难以置信的快速,如果我需要任何额外的功能,比如通知之类的,很容易添加它。还有一件事是,开销应该是最小的,因为您只需要代理插入请求,读取请求仍然可以在您的模块中有一个函数来保持API的一致性,但可以简单地调用相应的ETS函数。