我有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中。
如何正确杀死或退出流程?
谢谢。
答案 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
中有一个尚未完成运行的长时间通话。我建议您添加日志记录信息并查看卡住的位置。