Erlang 如何结束或终止进程?

6

我有一个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个回答

20
请注意,如果Pid是进程本身,则exit(Pid, Reason)exit(Reason)不会执行相同的操作。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

1

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

通常情况下,您不需要向进程添加exit/2。当函数运行完毕时,它会自动退出。

您可能在这里的某些代码中有一个长时间运行的调用尚未完成。我建议您添加日志信息并查看您卡在哪里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接