2013-02-24 26 views
0

可以說我有一個父級和一些子級的監督樹。孩子們是短暫的。但被其他進程使用。父母負責將用戶指向正確的孩子。在主管樹中終止子進程的正確方法是什麼

User ---lookup(child)--> Parent 
User <----PidOfChild----- Parent 

User --request(Resouce)--> Child 
User <------respond------ Child 

可以說孩子關閉兩個序列之間,這將是關停孩子序,以避免在用戶端崩潰的正確方法是什麼?

用戶可以監視孩子,但真的有幫助。因爲用戶在一次交易中做了所有這些事情?

回答

1

如果您正在考慮避免在用戶端擁有某些內容的備用方法,則可以將父級作爲消息代理,如果您正在調用父級並立即調用子級。

User ---request(Resouce)--> Parent --request(Resouce)--> Child 
User <---reponse------------ Parent <-response----------- Child 

父母必須將請求投給孩子,以避免阻塞。通過這種方式,父母也可以跟蹤孩子並相應地向用戶做出迴應。如果孩子關機,它可以相應地重新啓動,或者如果沒有活動的請求,它可以關閉孩子。家長不應該進行任何處理,因爲這可能成爲這種方法的瓶頸。

2

在這種情況下,正確的解決方案是在用戶端處理:沒有「關閉」孩子的故障安全方式,以便它響應用戶。總會有某種地方的競賽條件會使它變得糟糕。

如果您使用的是gen_server:cast/call,則可以提供超時等待請求失敗之前等待的時間並正確捕獲它。如果使用的是原始接收塊:

receive 
    some_response -> {ok, some_response} 
after 
    5000 -> % do something. 
end. 
+0

我在想,我覺得有一種方法。首先在用戶和父母之間建立一個訂閱模型,然後讓父母負責關閉沒有任何當前訂閱的孩子,並且訂閱模型可以用簡單的監視器完成。 – 2013-02-25 03:20:39

0

如果您的請求孩子關機之前建造的,你應該使用收到... ...或gen_server:呼叫方案。 如果您的請求是在孩子關閉後構建的,也許您可​​以等待請求,直到超時或孩子成爲學習者。

相關問題