ETS 批量操作是原子操作吗?
Posted
技术标签:
【中文标题】ETS 批量操作是原子操作吗?【英文标题】:Are ETS bulk operations atomic? 【发布时间】:2018-01-06 11:45:03 【问题描述】:具体来说,:ets.tab2list
和 :ets.file2tab
。这些函数是“快照”表状态,还是其他操作可以在这些函数完成时交错读写?
【问题讨论】:
您的意思是tab2file
而不是tab2list
?
两者,我希望他们有相同的保证或缺乏保证。
【参考方案1】:
基于文档here:
内部遍历表的函数,如
select
和match
,提供与safe_fixtable
相同的保证。
在哪里
[...] 函数
safe_fixtable
可用于保证一系列 first/1 和 next/2 调用无错误地遍历表,并且表中的每个现有对象仅被访问一次,即使另一个(或相同的)进程同时删除或插入对象到表中。
具体与您的问题相关:
没有其他保证;特别是在这种遍历过程中插入或删除的对象可以访问一次或根本不访问。
编辑
ets:tab2list/1
调用 ets:match_object/2
,这是一个用 C 实现的内置函数 (BIF)。实现 here 使用的是 BIF ets_select2
,它是 ets:select/2
的实现。
ets:file2tab
最终会调用 load_table/3
,它只使用了 ets:insert/2
。
ets.erl
中ets:tab2file/3
的代码使用ets:select/3
获取第一个块,然后使用ets:select/1
获取表中的其余块。
【讨论】:
我不相信这些文档回答了这个问题。不清楚 tab2x 和 x2tab 是否使用 select/match、safe_fixtable 或其他机制。 @knite 你是对的,我遵循了ets.erl
中的代码,但没有提到:P。我用这些信息更新了答案。以上是关于ETS 批量操作是原子操作吗?的主要内容,如果未能解决你的问题,请参考以下文章
Set,Sorted Set相关命令操作,批量插入及管道,事务
请教一下 postman可以批量测试吗?如果可以的话 烦请提供下具体操作 谢谢