2011-05-29 37 views
1

我正在編寫地圖/減少字計數器以瞭解OTP。我創建了一個可以啓動reducer的simple_one_for_one主管。對於每個密鑰,我想要檢查是否已經有孩子,如果沒有,請讓主管創建孩子。檢查OTP中的現有孩子simple_on_for_one主管

我現在開始主管模塊中的孩子的是這樣的:

start_child(Key) -> 
    supervisor:start_child(?SERVER, [Key]). 

我想這樣做(未經測試):

start_child(Key) -> 
    case supervisor:child_pid(Key) of 
    Pid -> Pid; 
    _ -> supervisor:start_child(?SERVER, [Key]) 
    end. 

什麼是一個很好的OTP辦法,找出如果Key已經有孩子了?

回答

2

建設啓動監事:

  • 一個gen_server。我們稱之爲reducer_server
  • simple_one_for_one supervisor。讓我們把它reducer_sup

確保您的主要主管reducer_server開始之前reducer_supreducer_server的狀態可以是Key-> Pid對的字典。然後reducer_server將有一個功能類似reduce(Key)其或者發現字典中的關鍵,並知道相應的進程,或沒有找到鑰匙,運行像一個函數:

new_reduce(Key) -> 
    case supervisor:start_child(reducer_sup, [Key]) of 
     {ok, Pid} when is_pid(Pid) -> {ok, Pid}; 
     {ok, Pid, _} when is_pid(Pid) -> {ok, Pid}; 
     _ -> error 
    end. 

剛生成的PID添加到您的狀態並且您應該準備好接下來致電reduce/1。我建議您閱讀thisthis以更好地瞭解所有這些部件如何協同工作。如果您將此代碼放入生產環境中,則可能需要考慮如下內容:

  • 當進程死亡時會發生什麼?提示:用is_process_alive/1檢查活躍度。
  • 如果reducer_serverreducer_sup死亡會發生什麼情況?
+0

很好的回答,tnx! – 2011-05-30 06:11:04