2015-02-09 22 views
0

我想在Erlang中編寫一個函數,它將在接收循環中等待,然後產生其他進程。它需要能夠使用給定的用戶名創建流程。另外,如果沒有給出用戶名,則需要將它們命名爲「Anonymous1,Anonymous2,...」等。在erlang中註冊可變用戶名的過程

這是我到目前爲止有:

-module(masterNode). 

%% ==================================================================== 
%% API functions 
%% ==================================================================== 
-export([listen/0]). 



%% ==================================================================== 
%% Internal functions 
%% ==================================================================== 


listen() -> 
    receive 
     {UserNodeName, createNode} -> 
      Pid = spawn(userNode, listen, []), 
      register(UserNodeName, Pid), 
      io:format("User Node Created!~n"), 
      listen(); 
     {createNode} -> 
      Pid = spawn(userNode, listen, []), 
      register(anonymous, Pid), 
      io:format("Anonymous User Node Created!~n"), 
      listen();  
     _ -> 
      io:format("Invalid syntax!.~n") 
    end. 

我遇到兩個問題:

  1. 我不知道如何使用一個變量名的註冊過程用戶將提供。由於這個名稱可能每次都不相同,它必須是它們傳遞它的變量,但是register()函數需要一個原子作爲名稱。

  2. 我已經找到一種方法,以模式匹配,並創建一個匿名用戶,但我不知道怎麼每次遞增名稱。現在它很難被編碼爲「匿名」的原子。看起來像在大多數語言中,你可以創建一個全局變量,然後增加它,然後連接到名稱上。但我不確定我可以在這裏做到這一點。

對這兩個問題有何建議?

回答

0
  1. 只求一個字符串,並使用list_to_atom/1

    1>輸入= 「用戶提供的字符串」。 「用戶提供的字符串」 2> list_to_atom(Input)。 「用戶提供的字符串」

  2. 您需要在您的「狀態」保持一個計數器。你可能在listen()添加變量,或在此過程中詞典中的條目(例如I = get(anonymous_counter), put(anonymous_counter,I+1))等然後可以該號碼作爲之前轉換爲字符串(例如integer_to_list/1),它附加到字符串"anonymous",並轉換爲一個原子。

3

你還應該問你:爲什麼我必須註冊這些過程。用標準庫註冊一個進程需要一個原子作爲名字,並且在運行時創建原子並不是一個好主意,因爲它們的數量是有限的,並且它們不是垃圾收集。也許你可以將進程Pid存儲在一個服務器上(在ets,list,mnesia ...中)並且標識每個用戶。服務器將負責「註冊」新用戶,當進程死亡時刪除條目,並在某些get_user_pid(User)請求上返回pid。

如果你真的需要註冊或者乾脆避免開發這一塊的代碼,庫gproc會爲你做這項工作。