Erlang:将PID存储在ETS中

时间:2014-10-06 12:49:12

标签: erlang pid ets

在服务器中,我试图将它连接的客户端及其PID存储在ets表中。

在启动服务器时创建表

initate_server() ->
                ets:new(users, [set, named_table]).

当用户连接到服务器时,我正在调用一个功能

add_user(PID, Nick) ->
         ets:insert_new(users, {Nick, PID}).

这反过来会产生一个错误,说我在上面使用了一个错误的参数。是否可以将PID存储在这样的ets表中?

错误说明如下:

 Something went very wrong! 
    {{case_clause,   
      {'EXIT',    
       {badarg,
        [{ets,insert,[users,{"user01", <0.66.0>}],[]},
          {server, loop, 2,
           [{file,

        filenames and such...

2 个答案:

答案 0 :(得分:4)

是的,您可以将pids存储在ETS表中。 badarg错误的原因可能是访问控制。

默认情况下,使用protected访问权限创建ETS表。这意味着任何进程都可以从表中读取值,但只有创建表的进程才能为其写入值。根据您希望它的工作方式,您可以让客户端进程向服务器发送消息以插入新值,或者使用public选项创建表,这样任何进程都可以写入表。 / p>

答案 1 :(得分:3)

执行ets时,你确定你的ets表仍然存在:insert_new / 2?

一旦创建它的进程死亡,ets表就会消失。如果你在shell(或shell调用的函数)中创建它,它会在你输入错误时立即消失,产生错误(一个简单的2/0就会这样做)。如果你在shell生成的函数中创建了ets,它会在此函数结束或死亡时立即消失。 Steve Vinoski在这里有一篇关于ets的有趣论文:Don’t Lose Your ets Tables以及DeadZen在etsgive

的实现