【问题标题】:Erlang ETS table eventsErlang ETS 表事件
【发布时间】:2016-06-03 06:14:12
【问题描述】:

如果我想将它用于共享状态,是否有任何既定机制可以等待插入 ETS 表?

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

【问题讨论】:

    标签: erlang blocking mnesia ets


    【解决方案1】:

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

    【讨论】:

    • 我希望有比直接使用 ETS 更快的方法,注册另一层间接和序列化是不幸的。不过,我会将此答案标记为正确,因为它确实是 ETS 唯一可行的方法。
    • 这正是 Mnesia 所做的,加上许多其他的东西,这就是它效率较低的原因。 ETS 的大多数用法不需要​​您想要的 - 每个插入密钥的通知。作为一名开发人员,我更喜欢 ETS 精简且(令人难以置信的)快速,如果我需要任何额外的功能,例如通知或其他功能,添加它很容易。另一件事是开销应该是最小的,因为您只需要代理插入请求,读取请求仍然可以在您的模块中有一个函数(为了 API 一致性),但可以简单地调用相应的 ETS 函数。
    【解决方案2】:

    ETS 没有事件的概念。

    但是,您可以通过将读取器进程放入“接收”子句来实现您所描述的内容,然后在加载数据后让写入器进程向读取器发送消息。

    【讨论】:

    • 这只是解决了问题,因为编写器进程必须知道未来其他读者关心哪些,即事件订阅。对于我的用例,我不认为这是非常高效的。我想产生一群工人,其中一些可能必须等待其他工人完成处理他们的片段才能开始。在不序列化所涉及的工作的情况下,没有一种明显的方法可以预先绘制出这种关系。
    • 抱歉,您的问题并不清楚您有很多工人。在那种情况下,你是对的,我建议的不是最好的解决方案。看起来你最好的办法是在它周围写一个包装器。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2016-09-10
      • 2021-01-19
      • 2016-10-27
      • 2010-12-30
      • 2015-10-27
      • 2010-12-19
      • 2011-02-17
      • 2018-09-25
      相关资源
      最近更新 更多