我有一个主管结构,每个(TCP)连接都需要一个主管。现在似乎每个主管都需要它自己的唯一名称,而这又需要是一个原子(至少这是我从错误消息中收集到的)。
一种解决方法是每次生成一个新原子,类似于来自 erlang-questions list 的建议。
现在我了解到原子永远不会被清理,所以有可能被太多的连接DoSed,耗尽原子空间。这是如何正确完成的?
我有一个主管结构,每个(TCP)连接都需要一个主管。现在似乎每个主管都需要它自己的唯一名称,而这又需要是一个原子(至少这是我从错误消息中收集到的)。
一种解决方法是每次生成一个新原子,类似于来自 erlang-questions list 的建议。
现在我了解到原子永远不会被清理,所以有可能被太多的连接DoSed,耗尽原子空间。这是如何正确完成的?
这里涉及两种类型的名称,进程的注册名称和主管子的标识符。
不必为每个主管进程注册一个名称。启动主管进程有两个函数,supervisor:start_link/2
和supervisor:start_link/3
. start_link/3
启动主管并在给定名称下注册它,同时start_link/2
启动主管而不为其注册名称。(如果进程没有注册名称,则引用它的唯一方法是通过它的 pid。)
至于主管子进程的标识符,如果您的主管将拥有无限数量的子进程(无论这些子进程是工人还是主管),您通常会使用特殊的重新启动类型simple_one_for_one
。这意味着,主管没有保留静态子规范的列表(从init
回调函数返回或与supervisor:start_child
函数一起添加),而是有一个“模板”子规范,并且该supervisor:start_child
函数基于该模板创建“匿名”子规范。