2012-01-16 96 views
3

我有erlang應用程序。在這個應用中我運行spawn(?MODULE, my_foo, [my_param1, my_param2, my_param3]).Erlang完成或終止進程

而且my_foo過程:

my_foo(my_param1, my_param2, my_param3) -> 
    ... 
    some code here 
    ... 
    ok. 

當我打開ETOP我看到這個my_foo/3功能狀態:proc_lib:sync_wait/2

比我試圖把出口(個體經營( ),正常)在我的功能結束,但我看到相同的行爲:proc_lib:sync_wait/2在etop。

我該如何正確地殺死或退出進程?

謝謝。

回答

13

注意exit(Pid, Reason)exit(Reason)同樣的事情,如果Pid是過程本身。 exit/1告訴當前進程退出,從裏面如果你喜歡,而exit/2發送退出信號的過程。即使這個過程本身。所以,當你做exit(self(), normal)你實際上結束normal退出信號給自己,這是忽略

在這種情況下把exit調用在函數到底應不應該有任何區別的過程中自動死亡(含原因normal )當它開始的功能結束時。看起來這個過程在那之前暫停了。

proc_lib:sync_wait/2proc_lib:start/start_link之內被調用,並且坐等待產生的進程做proc_lib:init_ack/1/2返回start的返回值。這似乎是你的過程不叫init_ack

0

根據您在問題中提供的有限信息,我會懷疑您的流程尚未完成運行。

通常情況下,您不需要將exit/2添加到您的流程中。當功能完成運行時它會自動退出。

您可能在some code here中有一個長時間運行的呼叫尚未完成運行。我建議您添加日誌記錄信息並查看您卡住的位置。