erlang ets 选择奇怪的行为

标签 erlang ets

我在 erlang 中使用 ets:select 有一个奇怪的行为。

我获得了正确的 select 语句(下面的 4 和 5),然后在我的语句中出错(下面的 6),然后我再次尝试与 4 和 5 中相同的语句,但它不再起作用。

怎么了 ?任何的想法 ?

Erlang R14B01 (erts-5.8.2) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.2  (abort with ^G)
1> Tab = ets:new(x, [private]).
16400
2> ets:insert(Tab, {c, "rhino"}).
true
3> ets:insert(Tab, {a, "lion"}). 
true
4> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2']}]).      
["rhino","lion"]    
5> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2']}]).      
["rhino","lion"]
6> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2', '$3']}]).
** exception error: bad argument
 in function  ets:select/2
    called as ets:select(16400,[{{'$1','$2'},[],['$1','$2','$3']}])
7> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2']}]).      
** exception error: bad argument
 in function  ets:select/2
    called as ets:select(16400,[{{'$1','$2'},[],['$1','$2']}])

我的 ets 表被破坏了吗?会不会是 ets 的 bug?

谢谢你。

最佳答案

shell 进程已经创建了 ETS 表并且是它的所有者。当所有者进程终止时,ETS 表会自动删除。

因此,当您在 6 处遇到异常时,shell 进程终止,因此 ETS 表被删除。

制作 private也意味着没有其他进程可以访问它(因此即使表被持久化,新的 shell 也无法访问它),但在这种情况下,由于表已被删除,情况更糟。

关于erlang ets 选择奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101453/

相关文章:

sockets - 是 gen_tcp :accept/1 safe?

erlang - 限制 ETS 存储的增长

elixir - 如何在不扫描整个表的情况下检索 ets 键列表?

list - 在 Erlang ETS 中存储列表

string - 在 Erlang 中如何检查许多字符串是否不为空?

erlang - 如何通过在 Elixir 中调用进程来捕获或挽救被调用进程的崩溃错误

http - 怎么用httpc做POST/GET/HEAD?

erlang - 遍历和更新 Erlang ETS 表中所有元素的最佳方法是什么?

r - ets:ets(时间序列,模型 = "MAM")中的错误:非季节性数据

erlang - 如何在 Erlang/OTP 中将主管的 child pid 共享给另一个 child