如何在erlang OTP中重启子进程时向主管提供额外信息?

时间:2014-11-25 02:55:18

标签: erlang

假设我有一个主管sup监督一些工人,当一个工人开始时,它会注册一些名字,如worker_1worker_2等。{{1}崩溃并由worker_N重新启动,如何将新创建的进程注册为sup,即如何让工作人员的名字在重启后继续存在?

How to restart child with custom state using Erlang OTP supervisor behaviour?没有回答,因为我只想要这个名字,可能有一个解决方案。

1 个答案:

答案 0 :(得分:3)

您可以让工作人员在启动时通过调用register(Name, self())中的init并在其中传递Name作为参数来注册。这在整个节点中是全局的,因此注册的过程无关紧要。

<强> BUT

看起来你正在动态创建原子,因为你想在任何地方使用注册过程。这是非常常见的错误 - 但是有希望!

不是动态创建原子来命名现有的每个童工,而是首先考虑以下几点:

  • 你不需要全部命名。工人的工作有限 描述(如果他们没有你有更大的问题)他们是 几乎总是与他们的资源,他们的来电者或他们的产生者联系在一起, 谁已经了解他们。
  • 你确实需要它们命名(但实际上,你可能没有),因为它们 代表一个大系统的具体元素,如一个位置 游戏,聊天频道,跟踪受害者Twitter推特等。 通过保留[{Key, Value}]的摘要,以不同的方式命名它们 其中[{AnyTerm, Pid}]。这可以让您了解有关该过程的更多信息 查看其名称​​和可以保持系统的全局空间不受影响 私人工人碎屑。

还有更多......

如果要命名进程整数,那么在使用关系数据库(使所有内容都具有整数主键)时,无论Web开发人员犯了多少错误,或者您正在处理不需要名称的工作者< / em>的

如果您确实需要它们命名(它会发生),请考虑使用global模块(它允许您将任何术语命名为任何名称,并且名称可在所有节点上使用 - 魔术!), pg2模块中的“进程组”或gproc(为处理此问题而编写的库,还允许您使用要为进程命名的任何术语)。

个人笔记

如果您发现自己处于生成动态原子似乎是个好主意的情况(无论出于何种原因),您应该始终停止您正在做的事情并且非常认真地思考您正在做什么。这是因为生成原子是你做错了的强烈迹象。试着找出你为什么如此努力地对抗这个系统--Irlang并不打算那样工作。

在每一种情况下,我都是在我自己的代码中遇到过,或者在其他人的工作中目睹,这种事情表明一种更清洁,更Erlangy的做事方式存在,如果我发现一切都变得更容易无论如何,而不是在我正在努力的纠结逻辑的大结上添加更多层。好消息是,积累Erlang成语很快,而且很难忘记,因为他们通常会回想起这么多感觉(几乎总会发现你在发现公认的解决方案之前重新发明轮子 - 并且结束了“啊,伟大思想相似”的感觉最终结束了。)