2014-07-21 55 views
1

據我所知,監督進程可以監督Erlang/OTP行爲模型中的大量進程。監督Erlang/OTP監督行爲中的普通進程

該過程可以是gen_server,gen_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,啓動,[正常,[]}, { 'EXIT', { {badmatch, {錯誤, {關機, {failed_to_start_child,worker_1, {確定,狀態}}}}}, [{myapp_app,開始,如圖2所示, [{文件, 「SRC/myapp_app.erl」} ,{line,27}]}, {application_master,start_it_old,4, [{file,「a pplication_master.erl「},{線,272}]}]}}}}

+0

你怎麼知道它不起作用? – legoscia

+0

顯然,我跑了它,並得到錯誤。 – user3389168

+0

你得到了什麼錯誤? – legoscia

回答

3

最可能的原因,沒有看到你的來源,這是失敗的就是普通spawn調用返回只是一個PID,而不是到OTP start_link調用返回{ok, Pid},這是主管期望的。

對於一個普通的進程是否能夠被監督...

簡短的回答:是的,但你應該proc_lib啓動它。

很長的回答:是的,但你應該用proc_lib啓動它,其他一些事情不會受到傷害。基本上,如果您打算在OTP監督樹中工作,您的過程應該符合OTP標準。請參閱OTP Design Principles以瞭解特殊/自定義流程,正如legoscia在您的問題的評論中所建議的。

如果您監督的流程不是以proc_lib開頭的,那麼您將失去主管給您的某些「保證」(缺少更好的術語)。例如,一個主管將不會在其進程列表中啓動第二個進程,直到第一個進程完成其初始化函數(在gen_server/fsm/event的情況下)。通用spawn調用會丟失此「保證」。

+0

通用'spawn'調用丟失的保證,因爲,不像proc_lib,沒有「確認」步驟。另一方面,從'proc_lib'開始,迫使你使用'proc_lib:init_ack'來「確認」一個成功的啓動,並且調用進程(在這種情況下爲spawner; supervisor)在接收塊中等待,直到它收到這個確認信息。 –