微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ETS、persistent_term 和 process 字典之间有什么区别?

如何解决ETS、persistent_term 和 process 字典之间有什么区别?

我知道(至少)三种方式可以在 Erlang 中获得可变状态:

  • ETS 表格
  • persistent_term
  • 处理字典

它们的基本用法看起来和我很相似:

% ETS
1> ets:new(table1,[named_table]).
2> ets:insert(table1,{thing}).
3> ets:lookup(table1,thing).
[{thing}]

% persistent_term
1> persistent_term:put(table2,thing).
2> persistent_term:get(table2).
thing

% Process dictionary
1> put(table3,thing).
2> get(table3).       
thing

使用一种和另一种的区别和优缺点是什么?

我发现 ETS 的行为更像地图,但它与将地图保存在 persistent_term 或流程字典中有何不同?

解决方法

persistent_termets 公开了类似的 API,但它们不同,我将引用 manual

持久性术语是一项高级功能,并非 ETS 表的通用替代品。

不同之处在于术语存储在哪里以及更新时会发生什么,ETS 术语在读取时复制到进程堆中,其中 persistent_term 术语仅被引用。这导致当 persistent_term 中的一项更新时,所有拥有该术语副本(引用)的进程都需要将其实际复制到它们的堆中才能继续使用它。

对于庞大的术语,引用它们而不是复制它们可以节省大量时间,但更新的惩罚是严厉的。

另外,persistent_term 只是一个映射,而 ETS 可能是一个集合、有序集合、包或重复包,ETS 也提供了选择和匹配语义。

persistent_term 用作 ETS 所使用的非常特定用例的优化替代品。

关于进程字典,它是进程内部的一个本地 #{},始终可用。 ETS 和 persistent_term 可用于每个进程,每个进程的本地进程字典是不同的。使用过程字典时要非常小心,因为它会影响可读性。

,

@José 回答的一些免费信息:

process_dictionary 是本地的,它会随着进程消亡,无法从外部进程访问

persistent_element 是全局的,它只会随着节点而消亡。任何进程都可以访问它,不受控制。

ETS 由一个进程拥有,它可以被不同的进程共享,它随所有者死亡,所有权可以转让给另一个进程,它提供一些访问控制(公共、私有、受保护)和不同的组织类型和访问。

shell 中的一个简短会话显示了(大部分)这些差异。

{{1}}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。