监督Erlang / OTP主管行为中的普通过程

时间:2014-07-21 16:40:10

标签: erlang

据我了解,主管流程可以监督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,启动,[正常,[]]},                  {'出口',                      {{badmatch,                           {错误,                               {关掉,                                   {failed_to_start_child,worker_1,                                       {确定,状态}}}}},                       [{myapp_app,启动,2,                            [{文件, “SRC / myapp_app.erl”},{线,27}]},                        {application_master,start_it_old,4,                            [{文件, “application_master.erl”},{线,272}]}]}}}}

1 个答案:

答案 0 :(得分:3)

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

至于是否可以监督普通程序......

简短回答:是的,但你应该用proc_lib启动它。

答案很长:是的,但你应该用proc_lib启动它,还有一些其他的东西不会受到伤害。基本上,如果您希望它在OTP监督树中工作,那么您的流程应该符合OTP标准。有关特殊/自定义流程,请参阅legoscia在您的问题评论中建议的特殊/自定义流程。

如果您监督未使用proc_lib启动的进程,则会丢失某些"保证" (由于缺乏一个更好的术语)主管给你。例如,主管将不会在其进程列表中启动第二个进程,直到第一个进程完成其init函数(在gen_server / fsm / event的情况下)。这个"保证"遗失了spawn次通话。