2011-05-17 35 views
0

我有一個稱爲「monitor_node」的進程層次結構。每個monitor_node都由一位主管監督。主管孩子VS平原spawn_link

現在,每個節點都可能具有複雜的內部結構。意思是說,它可能(或不可能)有一些子過程需要它來正常運行。例如:進程發送保持活動消息。到目前爲止,我一直在使用簡單的spawn_link來創建這些「內部」進程 。但是,我已經意識到,在monitor_node(正在監督)的init函數中產生它們有時會導致此函數失敗(並因此導致整個管理器樹失敗)。我的問題是:將這些內部流程附加到主管樹是否是一個好的解決方案?我正在考慮將monitor_node更改爲監督其內部流程的主管。

我的疑惑是:

  1. 我會監督非常小的過程相當顯著數量。我不確定這是否是一種好的做法。

  2. 我可能事先並不知道給定的「內部」過程是一個簡單的過程或具有一些內部結構(也衍生出其他過程)。如果後者是這種情況,那麼我可能應該將這些「內在」進程附加到主管樹上。

我希望我沒有太困惑你。期待一個答案。

編輯:

一個非常類似的(如果不相同)的問題是討論here(3後)。給出的解決方案與我給出的答案相同。

回答

2

監事:

這裏有一個技巧,其中包括使用兩個監事。你的樹是這樣:

main_sup -> worker 
main_sup -> attached_pool_sup 

attached_pool_sup -> workers 

主要SUP是one_for_all,因此,如果工人或游泳池上司死了,那麼樹給毀了,並殺害了。泳池主管是一個simple_one_for_one,適合擁有數百或數千名工人。

初始化:

不要在init回調中做太多工作。主管會等到init完成,如果需要比平時更長的時間,你可以設置一個超時(你可以增加你的情況)。

一個技巧是快速超時(從init初始化爲0時返回),然後處理handle_info超時回調中的附加設置。這樣你就不會阻止主管。謹防比賽在這裏!

+0

感謝您的回答!我認爲'attach_pool_sup'將負責監督我在我的問題中寫過的「內部」過程? – gregorej 2011-05-17 09:00:06

+0

是的,這是正確的猜測:) – 2011-05-21 19:46:43

+0

好的。因此,在這種情況下,我的'monitor_node:init'函數必須爲每個內部進程調用'attached_pool_sup'上的'supervisor:start_child'。我對嗎?如果是的話,是不是會再次使'init'函數複雜化? – gregorej 2011-05-26 09:24:44