【发布时间】:2014-05-07 21:24:22
【问题描述】:
如果我用下面的代码创建一个模块
start_nonstop() ->
spawn(fun() ->
Pid = spawn(?MODULE, nonstop, [0]),
timer:sleep(1000),
exit(Pid, kill)
end).
nonstop(N) ->
io:format("number: ~B~n", [N + 1]),
nonstop(N + 1).
然后从 Erlang shell 调用 start_nonstop(),我看到了无穷无尽的一系列
number: 1
number: 2
...
这意味着nonstop(N)进程没有被调用exit(Pid,kill)按预期杀死...
我做错了什么?显然,这段代码是一个模型,但我认为进程中的某些逻辑错误总是有可能导致类似于此的无限循环行为。
我认为这可以由 Erlang 处理,但如果不是,我如何让 Erlang 应用程序在这种情况下受到保护?
Erlang 可以打破哪些“无限循环”模式?例如,如果我在 nonstop(N) 函数的中间放置一个 sleep ,Erlang 可以打破无限循环,但如果我放置一个 erlang:yield() 它仍然无法从无限循环中打破......
在这种情况下,无限进程对于试图杀死它的进程来说是本地的。但是,如果无限进程位于不同的(例如,远程)Erlang VM 中怎么办?那能不能杀了?
我是新手,在我投入过多精力学习 Erlang 并将其用于严肃的应用程序之前,我正在评估它。
谢谢
【问题讨论】:
-
我现在在使用这个线程时遇到了问题,因为我没有看到其他人已经做出的答案或 cmets(我可以在几分钟前看到)。有人可以帮忙吗?
-
请看我的回答。
标签: erlang