Erlang完成或杀死进程

时间:2012-01-16 09:03:20

标签: process erlang parallel-processing

我有erlang应用程序。在此应用程序中,我使用spawn(?MODULE, my_foo, [my_param1, my_param2, my_param3]).

运行流程

和my_foo:

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

当我打开etop时,我看到这个my_foo / 3功能状态:proc_lib:sync_wait/2

我尝试将exit(self(),normal)放在我函数的末尾,但我看到同样的行为:proc_lib:sync_wait/2在etop中。

如何正确杀死或退出流程?

谢谢。

2 个答案:

答案 0 :(得分:16)

请注意exit(Pid, Reason)exit(Reason) NOT 执行同样的操作,如果Pid是进程本身。 exit/1告诉当前进程退出 - 如果您愿意,可以退出内部 - 同时exit/2向进程发送退出信号,即使过程本身。因此,当您执行exit(self(), normal)时,您实际上是向自己发送normal退出信号,这会被忽略。

在这种情况下,在函数末尾放置exit调用应该没有任何区别,因为当启动它的函数结束时,进程会自动死亡(原因normal)。在此之前,似乎该过程暂停了。

proc_lib:sync_wait/2内调用

proc_lib:start/start_link并等待生成的进程执行proc_lib:init_ack/1/2以返回start的返回值。您的流程似乎没有调用init_ack

答案 1 :(得分:0)

根据您在问题中提供的有限信息,我会怀疑您的流程尚未完成运行。

通常,您无需在流程中添加exit/2。当函数运行完毕后,它将自动退出。

您可能在some code here中有一个尚未完成运行的长时间通话。我建议您添加日志记录信息并查看卡住的位置。