我有一個需要每個(TCP)連接的主管結構。現在看來,每個主管都需要它自己的唯一名稱,而這個名稱又需要是一個原子(至少這是我從錯誤消息中收集的)。唯一主管/服務器名稱
解決方法是每次生成一個新原子,類似於a suggestion from the erlang-questions list。
現在我瞭解到原子永遠不會被清理乾淨,所以有可能被太多的連接拒絕,耗盡原子空間。這是如何正確完成的?
我有一個需要每個(TCP)連接的主管結構。現在看來,每個主管都需要它自己的唯一名稱,而這個名稱又需要是一個原子(至少這是我從錯誤消息中收集的)。唯一主管/服務器名稱
解決方法是每次生成一個新原子,類似於a suggestion from the erlang-questions list。
現在我瞭解到原子永遠不會被清理乾淨,所以有可能被太多的連接拒絕,耗盡原子空間。這是如何正確完成的?
這裏涉及兩種類型的名稱,過程的註冊名稱和主管兒童的標識符。
沒有必要爲每個主管進程註冊名稱。有兩個啓動監督程序的功能,supervisor:start_link/2
and supervisor:start_link/3
。 start_link/3
啓動主管並在給定名稱下進行註冊,而start_link/2
啓動主管時未註冊名稱。 (如果該過程沒有註冊名稱,則唯一參考它的方法是通過其pid。)
至於主管兒童的標識符,如果您有主管將擁有無限數量的子流程(無論這些子進程是否爲工人或主管),通常使用特殊重啓類型simple_one_for_one
。這意味着,監督者不必保留靜態子規範列表(從init
回調函數返回或添加了supervisor:start_child
函數),而是具有單個「模板」子規範,而supervisor:start_child
函數基於該模板。