Erlang / ets:在得到“坏参数”后重置ets表?

时间:2009-12-27 02:39:48

标签: erlang ets

我一直在学习如何使用ets,但有一件困扰我的事情是,偶尔*,ets:match抛出一个bad argument ......而且,从他们开始,所有后续调用(甚至以前工作过的电话也会抛出bad argument

> ets:match(Tid, { [$r | '$1'] }, 1).
% this match works...
% Then, at some point, this comes up:
** exception error: bad argument
     in function  ets:match/3
        called as ets:match(24589,{[114|'$1']},1)
% And from then on, matches stop working:
> ets:match(Tid, { [$r | '$1'] }, 1).
** exception error: bad argument
     in function  ets:match/3
        called as ets:match(24589,{[114|'$1']},1)

有没有办法“重置”ets系统,以便我可以再次查询它(即从shell中查询)?

*:我无法重现这个问题......但是当我试图做“其他事情”时,它经常发生。

2 个答案:

答案 0 :(得分:10)

虽然我不是百分百肯定,this thread似乎回答了你的问题。您似乎正在shell中观察此行为。如果是这样,两个事实就会以令人困惑的方式相互作用:

  1. 一旦其拥有进程终止,就会删除ets表。
  2. 当erlang shell收到异常并以静默方式重新启动时,它会死掉。
  3. 因此,当您获得第一个异常时,当前的shell进程将导致删除ets表,然后为您启动一个新的shell进程。现在,当您尝试另一个ets:match时,它会失败,因为该表不再存在。

答案 1 :(得分:2)

戴尔已经告诉过你会发生什么。您可以通过在shell中不时调用self()来确认。

作为一种快速解决方法,您可以生成另一个进程来为您创建公共表。那个表不会随着你的shell而死。

1> self().
<0.32.0>    % shell's Pid

2> spawn(fun() -> ets:new(my_table, [named_table, public]), receive X -> ok end end).
<0.35.0>    % the spawned process's Pid

3> ets:insert(my_table, {a, b}).
true

现在做一个例外,检查表确实存活了。

4> 1/0.
** exception error: bad argument in an arithmetic expression
     in operator  '/'/2
        called as 1 / 0
5> self().
<0.38.0>   % shell's reborn, with a different Pid

6> ets:insert(my_table, {c, d}).
true
7> ets:tab2list(my_table).
[{c,d},{a,b}]    % table did survive the shell restart

要删除表格,只需向生成的流程发送内容:

8> pid(0,35,0) ! bye_bye.
bye_bye
9> ets:info(my_table).   
undefined