如果我使用以下代码创建模块
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)
函数的中间放置一个睡眠,Erlang可以打破无限循环,但是如果我放一个erlang:yield()
它仍然无法从无限循环中解脱......
在这种情况下,无限过程对于试图杀死它的人是本地的。但是,如果无限进程在不同的(例如,远程)Erlang VM中呢?它会被杀死吗?
我是一个新手,我正在评估Erlang,然后我花了太多精力学习并将它用于严肃的应用程序。
由于
答案 0 :(得分:1)
在此代码中,您生成两个进程。
在函数start_nonstop()
中,您生成一个进程,我们可以将其称为Process1
。然后在Process1
中,您生成另一个进程,我们将其称为Process2
。
Process2
的工作是:
nonstop(N) ->
io:format("number: ~B~n", [N + 1]),
nonstop(N + 1).
只需执行io:format("number: ~B~n", [N + 1])
,直到Process1
将其删除。
在我的环境中,Process2
可以被杀死。但变量N
从输出变得非常大。
number: 51321
number: 51322
number: 51323
number: 51324
number: 51325
number: 51326
number: 51327
number: 51328
number: 51329
number: 51330
number: 51331
number: 51332
7>