簡體   English   中英

為什么在 GenServer 中啟動 Supervisor 會導致進程重啟行為出現問題?

[英]Why does starting a Supervisor in a GenServer cause problems with process restart behavior?

正如問題的標題所說:

為什么在 GenServer 中啟動 Supervisor 會導致進程重啟行為出現問題?

我在這里找到了一個討論其中說明了以下內容:

具體來說:

  • “監督樹提供的保證較少,因為進程可能會退出,而監督者不會終止其子進程。”

  • “如果主管子項被命名,這可能會導致問題,因為當在樹的更高位置重新啟動時,命名的子項可能仍然存在(在其 init/1 中調用 start_link 的進程上方)

  • “你失去了一些高級的 OTP 功能,比如代碼重新加載,因為流程模塊是通過遍歷監督樹來發現的”

根本原因是什么? 這在一般情況下是否成立?

參考

  1. 相關代碼更改
  2. Github 問題

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM