3

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

表在服务器启动时创建

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

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

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

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

错误说明如下:

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

        filenames and such...
4

2 回答 2

5

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

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

于 2014-10-06T12:53:28.153 回答
3

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

一旦创建它的进程死亡,ets 表就会消失。如果您在 shell 中创建它(或由 shell 调用的函数),它会在您输入错误时立即消失,从而产生错误(简单的 2 / 0. 就可以了)。如果您在 shell 生成的函数中创建了 ets,则该函数一结束或终止,它就会消失。Steve Vinoski 有一篇关于 ets 的有趣论文:Don't Lose Your ets Tables and an implementation by DeadZen here etsgive

于 2014-10-06T13:48:41.720 回答