2012-03-24 35 views
2

我有幾個gen_server工作人員定期向硬件傳感器請求一些信息。傳感器可能暫時失效,這是正常的。如果傳感器失敗,工人將終止併發生異常。Erlang主管。重啓過程中,如果失敗幾次,放棄併發送消息

所有的工人都是從simple_one_to_one策略中派生出來的。此外,我有一個控制gen_server,它可以啓動和停止工作人員,也可以收到'DOWN'消息。

所以現在我有兩個問題:

  1. 如果工人被監督者的狀態丟失,這是不能接受我重新啓動。我需要用相同的狀態重新創建工人。

  2. 如果工作人員在一段時間內失敗了幾次,傳感器發生了嚴重的問題,需要操作員注意。因此,我需要放棄重新啓動worker並向事件處理程序發送消息。但是監控器的默認行爲在排氣過程重啓限制後終止。

我看到兩個解決方案:

  1. 設置過程中導師的類型爲臨時和控制他們,在控制gen_server重新啓動它們。但這正是主管應該做的,所以我正在重新發明輪子。

  2. 爲主監督員下的每個工作人員創建監督員。這完全解決了我的第二個問題,但重啓後工作人員的狀態丟失了,因此我需要一些存儲工具狀態的ets表。

我對Erlang很新,所以我需要一些建議來解決我的問題,至於哪個(如果有的話)解決方案是最好的。提前致謝。

+0

此主題將回答您的大部分查詢。基本上,主管不會存儲行爲狀態,相反你必須親自處理。 http://stackoverflow.com/questions/6881075/will-data-in-gen-server-be-kept-after-restarted-by-its-supervisor – 2012-03-28 08:17:25

回答

2

如果員工由主管重新啓動,其狀態會丟失,這不是 對我而言可接受。我需要用相同的狀態重新創建工人。

如果您需要進程狀態來保存進程生命週期,則需要將其存儲在別處,例如在ETS表中。

如果工人在時間 什麼大不了的事情發生了傳感器特定量失敗幾次,它需要運營商的 關注。因此,我需要放棄重新啓動worker,併爲事件處理程序發送一些 消息。但是排氣處理重啓限制後,主管的默認行爲是 終止。

正確。一般來說,你加入你的主管的邏輯越少,它就越好。主管應該監督兒童流程,就是這樣。但是你仍然可以通過monitor你的主管,並在你的主管放棄(只是一個想法)時得到通知。這樣,您可以避免重新發明輪子並使用主管來管理孩子。

+0

謝謝你的回答。粗略地說,我實現了類似的東西。現在我有兩層監督員,因此每個工作人員都有自己的專職主管,如果工作人員沒有頻繁死亡,並向控制服務器發送「DOWN」消息。所有工作人員在ETS表中保存關鍵信息。 非常感謝,確實! – galadog 2012-03-31 12:29:45