唯一的主管/服务器名称
Unique supervisor / server names
我有一个主管结构,每个 (TCP) 连接都需要一个主管。现在似乎每个主管都需要它自己的唯一名称,而这个名称又需要是一个原子(至少这是我从错误消息中收集到的)。
解决方法是每次生成一个新原子,类似于 a suggestion from the erlang-questions list。
现在我了解到原子永远不会被清理,所以有可能被太多的连接拒绝,耗尽原子 space。这是如何正确完成的?
这里涉及到两种名称,进程的注册名称和主管的标识符children.
没有必要为每个主管进程都注册一个名称。启动主管进程有两个函数,supervisor:start_link/2
and supervisor:start_link/3
。 start_link/3
启动主管并在给定名称下注册它,而 start_link/2
启动主管而不为其注册名称。 (如果进程没有注册名称,唯一的引用方式是通过它的 pid。)
至于 supervisor children 的标识符,如果你有一个 supervisor 将有无限数量的 child 进程(无论这些 child 进程是 workers 还是 supervisors ),您通常会使用特殊的重启类型 simple_one_for_one
。这意味着监督者没有保留静态 child 规范列表(从 init
回调函数返回或添加 supervisor:start_child
函数),而是有一个 "template" child 规范,supervisor:start_child
函数根据该模板创建 "anonymous" children。
我有一个主管结构,每个 (TCP) 连接都需要一个主管。现在似乎每个主管都需要它自己的唯一名称,而这个名称又需要是一个原子(至少这是我从错误消息中收集到的)。
解决方法是每次生成一个新原子,类似于 a suggestion from the erlang-questions list。
现在我了解到原子永远不会被清理,所以有可能被太多的连接拒绝,耗尽原子 space。这是如何正确完成的?
这里涉及到两种名称,进程的注册名称和主管的标识符children.
没有必要为每个主管进程都注册一个名称。启动主管进程有两个函数,supervisor:start_link/2
and supervisor:start_link/3
。 start_link/3
启动主管并在给定名称下注册它,而 start_link/2
启动主管而不为其注册名称。 (如果进程没有注册名称,唯一的引用方式是通过它的 pid。)
至于 supervisor children 的标识符,如果你有一个 supervisor 将有无限数量的 child 进程(无论这些 child 进程是 workers 还是 supervisors ),您通常会使用特殊的重启类型 simple_one_for_one
。这意味着监督者没有保留静态 child 规范列表(从 init
回调函数返回或添加 supervisor:start_child
函数),而是有一个 "template" child 规范,supervisor:start_child
函数根据该模板创建 "anonymous" children。