Erlang ETS table 事件
Erlang ETS table events
如果我想将它用于共享状态,是否有任何已建立的机制来等待插入 ETS table?
我知道 mnesia 支持 table 事件,我在想一个类似的机制对普通 ETS 很有用,这样一个进程就可以等待它需要的数据被加载。我认为做到这一点的唯一方法是旋转循环并不断请求给定的密钥直到它到达,但这似乎效率很低。我宁愿得到一个消息回调。如果我在我的和 ETS 之间插入一个过程,我就把问题推到了最后。
ETS 没有事件的概念。
但是,您可以通过将 reader 进程放入 'receive' 子句来实现您所描述的内容,然后让写入进程在数据后向 reader 发送消息已加载。
最简单的解决方法是启动一个 gen_server
进程并通过它代理所有插入请求。然后,您可以通过将回调保持在 gen_server
状态来注册回调,并在插入的键与模式匹配时调用它们。它甚至可以 运行 在单独的应用程序中,以允许专门的主管。
ets
中没有事件处理。它是非常低级的语言特性,由你来围绕它做一个包装。顺便说一句,这是在 mnesia
中完成的方式。所以你可以将你的共享状态包装到一个模块中,然后自己订阅并发送。
如果我想将它用于共享状态,是否有任何已建立的机制来等待插入 ETS table?
我知道 mnesia 支持 table 事件,我在想一个类似的机制对普通 ETS 很有用,这样一个进程就可以等待它需要的数据被加载。我认为做到这一点的唯一方法是旋转循环并不断请求给定的密钥直到它到达,但这似乎效率很低。我宁愿得到一个消息回调。如果我在我的和 ETS 之间插入一个过程,我就把问题推到了最后。
ETS 没有事件的概念。
但是,您可以通过将 reader 进程放入 'receive' 子句来实现您所描述的内容,然后让写入进程在数据后向 reader 发送消息已加载。
最简单的解决方法是启动一个 gen_server
进程并通过它代理所有插入请求。然后,您可以通过将回调保持在 gen_server
状态来注册回调,并在插入的键与模式匹配时调用它们。它甚至可以 运行 在单独的应用程序中,以允许专门的主管。
ets
中没有事件处理。它是非常低级的语言特性,由你来围绕它做一个包装。顺便说一句,这是在 mnesia
中完成的方式。所以你可以将你的共享状态包装到一个模块中,然后自己订阅并发送。