簡體   English   中英

Erlang:將PID存儲在ETS中

[英]Erlang: Store PID in 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...

是的,您可以將PID存儲在ETS表中。 badarg錯誤的原因可能是訪問控制。

默認情況下,ETS表是使用protected訪問創建的。 這意味着任何進程都可以從表中讀取值,但是只有創建表的進程才能向其中寫入值。 根據您希望它如何工作,您可以讓客戶端進程向服務器發送一條消息以插入新值,或者使用public選項創建表,該選項允許任何進程將其寫入表。

確定執行ets:insert_new / 2時ets表仍然存在嗎?

一旦創建表的進程死亡,ets表就會消失。 如果在外殼程序(或外殼程序調用的函數)中創建它,則在您鍵入錯誤時生成的錯誤將消失(簡單的2/0即可完成操作)。 如果您在外殼程序產生的函數中創建了ets,則該函數結束或消失后它將消失。 這里有史蒂夫·維諾斯基(Steve Vinoski)撰寫的有關ets的有趣論文: 不要失去您的ets表 ,DeadZen的實現在這里etsgive

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM