假设我有一个主管sup
监督一些工人,当一个工人开始时,它会注册一些名字,如worker_1
,worker_2
等。{{1}崩溃并由worker_N
重新启动,如何将新创建的进程注册为sup
,即如何让工作人员的名字在重启后继续存在?
How to restart child with custom state using Erlang OTP supervisor behaviour?没有回答,因为我只想要这个名字,可能有一个解决方案。
答案 0 :(得分:3)
您可以让工作人员在启动时通过调用register(Name, self())
中的init
并在其中传递Name
作为参数来注册。这在整个节点中是全局的,因此注册的过程无关紧要。
<强> BUT 强>
看起来你正在动态创建原子,因为你想在任何地方使用注册过程。这是非常常见的错误 - 但是有希望!
不是动态创建原子来命名现有的每个童工,而是首先考虑以下几点:
[{Key, Value}]
的摘要,以不同的方式命名它们
其中[{AnyTerm, Pid}]
。这可以让您了解有关该过程的更多信息
查看其名称和可以保持系统的全局空间不受影响
私人工人碎屑。还有更多......
如果要命名进程整数,那么在使用关系数据库(使所有内容都具有整数主键)时,无论Web开发人员犯了多少错误,或者您正在处理不需要名称的工作者< / em>的
如果您确实需要它们命名(它会发生),请考虑使用global
模块(它允许您将任何术语命名为任何名称,并且名称可在所有节点上使用 - 魔术!), pg2
模块中的“进程组”或gproc(为处理此问题而编写的库,还允许您使用要为进程命名的任何术语)。
个人笔记
如果您发现自己处于生成动态原子似乎是个好主意的情况(无论出于何种原因),您应该始终停止您正在做的事情并且非常认真地思考您正在做什么。这是因为生成原子是你做错了的强烈迹象。试着找出你为什么如此努力地对抗这个系统--Irlang并不打算那样工作。
在每一种情况下,我都是在我自己的代码中遇到过,或者在其他人的工作中目睹,这种事情表明一种更清洁,更Erlangy的做事方式存在,如果我发现一切都变得更容易无论如何,而不是在我正在努力的纠结逻辑的大结上添加更多层。好消息是,积累Erlang成语很快,而且很难忘记,因为他们通常会回想起这么多感觉(几乎总会发现你在发现公认的解决方案之前重新发明轮子 - 并且结束了“啊,伟大思想相似”的感觉最终结束了。)