据我了解,主管流程可以监督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
模块替换模块和函数以及函数内部的函数时,这很有效。
我能否断定主管的子流程不能成为普通流程?
我得到的错误是:
错误如下:应用程序: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}]}]}}}}
答案 0 :(得分:3)
最有可能的原因是,如果没有看到您的来源,这是失败的是普通的spawn
调用返回只是一个pid,而不是返回的OTP start_link
调用{ok, Pid}
,这就是主管所期望的。
至于是否可以监督普通程序......
简短回答:是的,但你应该用proc_lib启动它。
答案很长:是的,但你应该用proc_lib启动它,还有一些其他的东西不会受到伤害。基本上,如果您希望它在OTP监督树中工作,那么您的流程应该符合OTP标准。有关特殊/自定义流程,请参阅legoscia在您的问题评论中建议的特殊/自定义流程。
如果您监督未使用proc_lib启动的进程,则会丢失某些"保证" (由于缺乏一个更好的术语)主管给你。例如,主管将不会在其进程列表中启动第二个进程,直到第一个进程完成其init函数(在gen_server / fsm / event的情况下)。这个"保证"遗失了spawn
次通话。