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

据我所知,主管进程可以监督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模块和一个内部函数替换模块和函数时,这很有效。

我可以得出结论:监督员的儿童程序不能是一个普通的程序吗?

我得到的错误是:

错误如下:application:myapp exited:{bad_return,{{myapp_app,start,[normal,[]]},{'EXIT',{{badmatch,{error,{shutdown,{failed_to_start_child,worker_1,{ok,state }}}},[{myapp_app,start,2,[{file,“src / myapp_app.erl”},{line,27}]},{application_master,start_it_old,4,[{file,“application_master.erl “},{线,272}]}]}}}}


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

至于是否可以监督一个普通的流程......

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

很长的回答:是的,但你应该用proc_lib来启动它,并且其他一些东西不会受到伤害。 基本上,如果您打算在OTP监督树中工作,您的过程应该符合OTP标准。 正如legoscia在您的问题的评论中所建议的,请参阅OTP设计原则以了解特殊/定制流程。

如果你监督一个不是由proc_lib开始的流程,那么你会失去监督员给你的某些“保证”(因为没有更好的术语)。 例如,直到第一个进程完成其初始化函数(在gen_server / fsm / event的情况下),超级用户才会在其进程列表中启动第二个进程。 通用的spawn调用会丢失此“保证”。

链接地址: http://www.djcxy.com/p/38203.html

上一篇: Supervising an ordinary process in Erlang/OTP supervisor behaviour

下一篇: How to restart child with custom state using Erlang OTP supervisor behaviour?