【问题标题】:Handling python crash when handling recursion limit处理递归限制时处理python崩溃
【发布时间】:2022-01-04 07:07:34
【问题描述】:

想象一下这段代码:

def a():
    try:
        a()
    except RecursionError:
        a()
a()

似乎 sn-p 会递归地无限运行a 函数。 但真正发生的是:

  1. 创建递归错误
  2. 处理异常,因为您可以处理所有异常
  3. 再次做同样的事情 结果: python 吓坏了并崩溃(这不可能以我知道的任何方式处理,因为这不会引发错误,它崩溃 python解释器

任何人都可以看到它引发了什么异常:

Fatal Python error: _Py_CheckRecursiveCall: Cannot recover from stack overflow.
Python runtime state: initialized

Current thread 0x00007f2e14fca180 (most recent call first):  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 5 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  File "<stdin>", line 3 in a
  ...
Aborted (core dumped)

【问题讨论】:

    标签: python recursion exception crash crash-dumps


    【解决方案1】:

    为什么不直接增加系统递归限制?

    import sys
    sys.setrecursionlimit(1000000000)

    【讨论】:

    • 你测试过你的答案吗,因为你的数字太大了,所以 python 引发错误,数字无法转换为 C int + 每当我运行我的代码时它仍然崩溃,只需要等待大约 +1 秒。
    • 对不起,我为了示范而夸大了。但是您可以将限制提高得相当高。我将使用我找到的最大值进行编辑。
    • 顺便说一下,这个解决方案不会阻止 Python 最终崩溃,但它可能有助于延长它需要的时间。你的代码有点……奇怪。
    • 因此,使用新进程隔离可能导致此类崩溃的代码可能会更好?或者有更好的方法来做到这一点?
    • 如果你想让一个函数无限运行(尽可能长时间而不干扰主程序)把你拥有的代码放在一个守护进程中,它应该运行直到你崩溃或者直到你杀死主要过程。我希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 2010-12-29
    • 2019-01-19
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多