我有聚合事件的genserver:
def init(opts) do
cache = :ets.new(:events_cache, [:set])
{:ok, cache}
end
def handle_info(:autoflush, cache) do
Logger.debug(fn -> "#{:ets.info(cache)[:size]} events was aggregated. Sending to transport..." end)
Events.emit(:ets.tab2list(cache))
Process.send_after(self(), :autoflush, @flush_after)
{:noreply, :ets.new(:events_cache, [:set])}
end
def handle_cast({:add_event, event}, cache) do
:ets.insert(cache, {event})
{:noreply, cache}
end
在
init
中,我创建了ets表。在 cast
中添加值,并在 info
中将数据刷新到外部调用,清理 ets 表的内存(正如我所想)。
问题:
编辑(2024年7月18日)只是回答问题,如果内存被收集,我认为应该是因为ETS表链接到进程,如果该进程终止,则必须删除ETS表。
提供一个正确的名称,如果您不相信正确清理 ETS,则可以使用该名称,但如果创建了多个服务器(未命名服务器),则这不是一个有效的选项。