监督Erlang / OTP主管行为中的普通进程
据我所知,主管进程可以监督Erlang / OTP行为模型中的大量进程。
该进程可以是gen_server
, gen_fsm,
和gen_event
。 我的问题是,一个普通的进程是否可以通过Erlang / OTP中的主管进程来监督? 通过普通的过程,我的意思是一个不是gen_server
, gen_fsm
或gen_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
调用会丢失此“保证”。
上一篇: Supervising an ordinary process in Erlang/OTP supervisor behaviour
下一篇: How to restart child with custom state using Erlang OTP supervisor behaviour?