2016-01-22 60 views
2

doc爲什麼在調用start_child時不能simple_one_for_one指定不同的子ID?

注意,當重新啓動策略是simple_one_for_one,孩子規格列表必須是隻有一個孩子規格列表。 (子規範標識符被忽略。)然後在初始化階段沒有啓動子進程,但所有的子進程都被假定爲使用supervisor start_child/2動態啓動。

什麼是對部分設計的考慮?它不會停止在每個子進程中主動調用register(<chid_id>, ChildPid) 。子進程的PID

+1

衍生的進程可以自己註冊,但simple_one_for_one的點是創建* *相同過程的軍團。你不用像C或Python這樣的語言來命名池中的工作線程 - 你往往只是根據可用性將它們引用到一個隊列或一對列表中。同樣,你不傾向於命名由simple_one_for_one產生的工人 - 他們通常被任何其他(非監督者)進程請求產生的工作直接引用。他們*可以*自己註冊*,但這通常是不可取的。 – zxq9

回答

3

註冊的名字是沒有關係的主管。

考慮一個bog標準管理者(不是動態的),子規範通過調用child_module:start_link爲監管者提供足夠的信息來啓動子進程,但是它是child_module:start_link的實現,它決定了進程開始並可能進行名稱註冊。一個典型的child_module:START_LINK實施將是這樣的:

​​3210

正是這種調用gen_server:START_LINK/4,導致gen_server與「服務器名稱」的名稱進程PID合力的註冊。

你可以調用gen_server:start_link/3代替,在這種情況下,gen_server進程沒有名字,除非你在init/1行爲實現中調用erlang:register/2或類似的東西。

這是一件好事,因爲沒有理由夫婦名字登記的監督,模塊/進程的名稱是關於模塊和它的服務,它是如何訪問和使用,不是監管策略。

這是很常見的監督流程,爲自己註冊的名字,從而成爲任何其他工藝可以輕鬆地訪問命名服務。

但是,對於簡單的一對一監督,通常受監督的孩子不會有名字,因爲他們應該是同質的(即不要創建一個簡單的一對一主管,動態地啓動各種工作人員,如果他們都做不同的事情做不同的事情,那麼他們幾乎肯定有不同的相對重要性,他們應該在不同的監督者之下),因此,獨特的名字是沒有用/適當的。

當調用start_child時,您不能選擇不同的子標識符的原因是子標識符實際上是子規範的標識(即子類型),而不是任何子進程的標識就像這樣。使用不同的兒童標識符會說'這是一種與另一種不同的過程'。這符合兒童規範是一個列表的要求。

+0

如果我在不同的時間創建相同類型的孩子,但是需要區分哪些孩子爲誰提供服務,該怎麼辦?請參閱我在另一個問題中討論的細節[鏈接](http://stackoverflow.com/questions/34923516/how-to-keep-track-of-children-processes-in-erlang) – gy8409

+0

我對你解釋的最後一段感到困惑。用孩子ID創建的其他類型的孩子是因爲行爲模式在較低級別上做這項工作。 – gy8409

+0

在不同的時間創建相同的類型是很好的。這對於一個人來說很簡單。在我看來,鑑別它們也是很好的,因爲必須有許多實際的理由,因爲這些孩子一定是有原因創建的,他們可能有狀態並正在執行與其他過程有關的特定事件的任務,並且我敢肯定,有很多合法的案例會導致他們可能需要查找/追蹤的情況。如果任何一個孩子崩潰總是沒有比其他任何一個更好/更差,那就是應該的。 – Michael

相關問題