Erlang:spawn_link 当一切正常关闭时,进程不会被杀死
Erlang: spawn_link processes are not killed when everything shuts down normally
模块测试:
tester() ->
receive
X ->
erlang:display("message.."),
tester()
end.
initialize() ->
spawn_link(?MODULE, tester, []),
erlang:display("Started successfully.").
回复:
length(erlang:processes()). -> 23
Pid = spawn_link(test, initialize, []).
length(erlang:processes()). -> 24
exit(Pid).
length(erlang:processes()). -> 24
生成的测试进程似乎仍然是运行!我如何确保当我退出我的应用程序时,所有 spawn_link 进程也被终止?
好吧,您实际上是在启动两个 Erlang 进程,而不是一个。您向其发送 exit
信号的第一个在您发送退出信号之前就已死亡,因此 exit
无效。
您在 shell 这一行中启动的第一个进程:
Pid = spawn_link(test, initialize, []).
这个进程开始执行initialize
函数,在这个函数中它启动了第二个进程,然后它死掉了,因为没有别的事可做。这是您要向其发送 exit
信号的进程。
要解决此问题,只需 return 来自初始化函数的正确 Pid
:
initialize() ->
Pid = spawn_link(?MODULE, tester, []),
erlang:display("Started successfully."),
Pid.
并直接启动:
Pid2 = test:initialize().
然后你就可以用exit(Pid2).
杀死它
模块测试:
tester() ->
receive
X ->
erlang:display("message.."),
tester()
end.
initialize() ->
spawn_link(?MODULE, tester, []),
erlang:display("Started successfully.").
回复:
length(erlang:processes()). -> 23
Pid = spawn_link(test, initialize, []).
length(erlang:processes()). -> 24
exit(Pid).
length(erlang:processes()). -> 24
生成的测试进程似乎仍然是运行!我如何确保当我退出我的应用程序时,所有 spawn_link 进程也被终止?
好吧,您实际上是在启动两个 Erlang 进程,而不是一个。您向其发送 exit
信号的第一个在您发送退出信号之前就已死亡,因此 exit
无效。
您在 shell 这一行中启动的第一个进程:
Pid = spawn_link(test, initialize, []).
这个进程开始执行initialize
函数,在这个函数中它启动了第二个进程,然后它死掉了,因为没有别的事可做。这是您要向其发送 exit
信号的进程。
要解决此问题,只需 return 来自初始化函数的正确 Pid
:
initialize() ->
Pid = spawn_link(?MODULE, tester, []),
erlang:display("Started successfully."),
Pid.
并直接启动:
Pid2 = test:initialize().
然后你就可以用exit(Pid2).