我有一个需要每个(TCP)连接的管理程序的管理程序结构。现在看来每个主管都要求它拥有自己独特的名称,而这个名称又需要是一个原子(至少我从错误信息中收集的是什么)。
解决方法是每次生成一个新原子,类似于a suggestion from the erlang-questions list。
现在我了解到原子永远不会被清理干净,所以有可能通过太多连接进行DoSed,耗尽原子空间。这怎么做得好?
答案 0 :(得分:4)
这里涉及两种类型的名称,进程的注册名称和主管子项的标识符。
没有必要为每个主管流程注册名称。启动主管流程有两个功能supervisor:start_link/2
and supervisor:start_link/3
。 start_link/3
启动主管并以给定名称注册它,而start_link/2
启动主管而不为其注册名称。 (如果进程没有注册名称,则引用它的唯一方法是通过其pid。)
对于主管子项的标识符,如果您的主管具有无限数量的子进程(无论这些子进程是工作者还是主管),您通常使用特殊重启类型{{1} }。这意味着,不是保留静态子规范列表(从simple_one_for_one
回调函数返回或添加init
函数),监督者只有一个“模板”子规范,{ {3}}函数基于该模板创建“匿名”子项。