【问题标题】:Supervising an ordinary process in Erlang/OTP supervisor behaviour在 Erlang/OTP 监督行为中监督普通进程
【发布时间】:2014-09-12 06:18:28
【问题描述】:

据我了解,一个监督进程可以监督 Erlang/OTP 行为模型中的多个进程。

这些进程可以是gen_servergen_fsm,gen_event。我的问题是,普通进程能否由 Erlang/OTP 中的主管进程监督?我所说的普通进程是指不是gen_servergen_fsmgen_event 的进程。

如果是这样,流程规范会是什么样子?我在下面尝试但不起作用:

Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5000, worker, [my_module]}

我也试过这个:

Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5000, worker, []}

但是当我用 gen_server 模块和其中的函数替换模块和函数时,效果很好。

我可以断定主管的子进程不能是普通进程吗?

我得到的错误是:

错误如下:应用程序:myapp 退出:{bad_return, {{myapp_app,start,[正常,[]]}, {'出口', {{失败匹配, {错误, {关掉, {failed_to_start_child,worker_1, {ok,state}}}}}, [{myapp_app,开始,2, [{file,"src/myapp_app.erl"},{line,27}]}, {application_master,start_it_old,4, [{file,"application_master.erl"},{line,272}]}]}}}}

【问题讨论】:

  • 你怎么知道它不起作用?
  • 显然,我运行了它,并得到了错误。
  • 你遇到了什么错误?
  • 我的问题是:一个普通的进程可以被一个supervisor进程监督吗?
  • 在不使用标准行为的情况下适合受监督树的进程称为“特殊进程”,原则上应遵循in the Sys and Proc_Lib chapter of the OTP Design Principles User Guide 描述的准则 - 但实际上您通常可以忽略那些指导方针。这就是我询问错误消息的原因:您的问题中没有任何内容可以提供任何关于出现问题的线索。

标签: erlang


【解决方案1】:

最可能的原因是普通的spawn 调用返回只是一个pid,而不是返回{ok, Pid} 的OTP start_link 调用,而没有看到你的来源,这失败了,这正是主管所期望的。

至于普通进程能不能被监督……

简短回答:是的,但您应该从 proc_lib 开始。

长答案:是的,但您应该从 proc_lib 开始,其他一些事情也不会受到伤害。基本上,如果您打算让它在 OTP 监督树中工作,则您的流程应该符合 OTP。请参阅 OTP Design Principles 了解特殊/自定义流程,正如 legoscia 在 cmets 中针对您的问题所建议的那样。

如果你监督一个不是用 proc_lib 启动的进程,你就会失去监督者给你的某些“保证”(因为没有更好的术语)。例如,在第一个进程完成其 init 函数(在 gen_server/fsm/event 的情况下)之前,主管不会启动其进程列表中的第二个进程。通用spawn 调用会丢失此“保证”。

【讨论】:

  • 通用spawn调用会丢失保证,因为与proc_lib不同,没有“确认”步骤。另一方面,从proc_lib 开始,强制您使用proc_lib:init_ack“确认”成功启动,并且调用进程(在本例中为生成器;主管)在接收块中等待,直到它收到此确认消息。
猜你喜欢
  • 2011-05-24
  • 2016-02-12
  • 2018-01-31
  • 2011-08-07
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2023-03-02
相关资源
最近更新 更多