【问题标题】:How to kill an infinite loop process in Erlang如何在 Erlang 中杀死一个无限循环进程
【发布时间】: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


【解决方案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> 

【讨论】:

  • 我现在看到 Erlang 成功地杀死了 Process2。我做了一些其他的测试,似乎 Process2 真的被杀死了,但是由于迭代了很多,所以在 Process2 被杀死之后,shell 仍然在写很长时间。感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 2011-03-30
  • 2014-01-14
  • 2021-01-05
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多