[英]Why does starting a Supervisor in a GenServer cause problems with process restart behavior?
OTP(監督樹)建立在 BEAM 功能之上,例如監控、鏈接、信號和捕獲它們。
Supervisor 本身就是gen_servers
,其唯一目的是監視/重新啟動他們的孩子並以標准方式終止他們/死亡。 如果您創建了一個生成主管的gen_server
,則意味着您在該級別中有所作為,而常規主管沒有晉級。
讓我們考慮這個 OTP 場景:
P1 - Parent supervisor
|
G1 - GenServer
|
S1 - Children supervisor
|
C1 - Children worker
主管在終止自己之前等待所有他們的孩子退出,如果您有一個作為主管(G1)的gen_server
在其所有孩子(S1)終止之前由於某種原因死亡,則父母可能會重新啟動gen_server
(G1') . 這將產生 S1',而后者將產生 C1'。
突然有幾個 S1 和 C1 的實例同時運行,這很可能是一個問題。
關於提到的代碼重載問題,這意味着code_changed
回調樹觸發器將在 G1 處停止(因為 G1 不會將其傳播到 S1),而不是不會加載代碼。
TL;DR:主管是非常專業的gen_servers
。 如果您將常規gen_server
放在監督樹的中間,而沒有提供監督者提供的所有保證,您將失去該子樹中的一些 OTP 特性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.