[英]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.