在Erlang/OTP监督员行为中监督一个普通流程

  • 本文关键字:一个 OTP Erlang 监督员 erlang
  • 更新时间 :
  • 英文 :


据我所知,一个supervisor进程可以在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,〔normal,〔〕〕},{退出',{{不匹配,{error,{关闭,{failed_to_start_child,worker_1,{好,状态为{0},[{myapp_app,开始,2,〔{file,"src/myapp_app.erl"},{line,27}〕},{application_master,start_it_old,4,〔{file,"application_master.el"},{line,272}〕}〕}}}

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

至于一个普通的过程是否可以被监督。。。

简短回答:是的,但您应该以proc_lib开头。

长话短说:是的,但你应该从proc_lib开始,其他一些事情不会有什么坏处。基本上,如果您希望流程在OTP监督树中工作,那么流程应该符合OTP。如legoscia在对您的问题的评论中所建议的,请参阅OTP设计原则以了解特殊/定制流程。

如果你监督一个不是用proc_lib启动的过程,你就会失去主管给你的某些"保证"(因为没有更好的术语(。例如,在第一个进程完成初始化功能(在gen_server/fsm/event的情况下(之前,主管不会启动其进程列表中的第二个进程。这种"保证"在一般的spawn调用中丢失。

相关内容

最新更新