致命 Python 错误:无法从堆栈溢出中恢复



我在互联网上读到类似的问题,但没有一个答案可以帮助我。我有一个函数,对于每行数据(数据大约有 2'000'000 行(做一些事情,然后根据它所做的内容调用具有不同参数的相同函数。问题是一段时间后我在终端中收到此错误:"致命的 Python 错误:无法从堆栈溢出中恢复。

导致此错误的最常见错误是无限循环,但我控制并且没有无限循环。因此,对我来说,"sys.getrecursionlimit(("设置为3000的问题,这意味着在调用相同函数3000次后,它将给我错误。

首先,我不明白终端中的"致命 Python 错误:无法从堆栈溢出中恢复"或 jupyternotebook 中的"递归错误:超出最大递归深度"之间的区别。事实上,对我来说,它可能来自同样的错误(例如无限循环(。

当用一个名为"test_"的简单函数替换我的函数时,我有以下代码:

import sys
print(sys.getrecursionlimit())
def test_(x,t):
x = x+1
if x<t:
test_(x=x,t=t)
print(test_(0,2971)) # output: None
print(test_(0,2972)) # RecursionError: maximum recursion depth exceeded in comparison

3000

没有

---------------------------------------------------------------------------递归错误回溯(最近调用( 最后( 在 (( 中 8 9 打印(test_(0,2971(( ---> 10 打印(test_(0,2972((

在test_(x, t( 5 x = x+1 6 如果 x 7 test_(x=x,t=t( 8 9 打印(test_(0,2971((

。最后 1 帧重复,从下面的帧...

在test_(x, t( 5 x = x+1 6 如果 x 7 test_(x=x,t=t( 8 9 打印(test_(0,2971((

递归错误:比较中超过了最大递归深度

为了克服这个问题,我在不丢失"运行连续性"的情况下调整了函数,以便我可以使用批处理:

for i in np.arange(0,9000,2000):
test_(i,i+2000)

有人会有更好的解决方案吗?另外,一般来说,当我们知道我们有很多迭代要做时,做递归函数是一个坏主意?还有谁知道我如何在每个循环中打印递归深度?

我正在开发一个Linux虚拟环境,使用jupyter notebook,使用python 3.6和anaconda。

请检查这个问题(它对我有用(: 如何获取 Python 解释器堆栈的当前深度?

基于该答案的代码:

import sys
import inspect
print(sys.getrecursionlimit())
def test_(x, t):
print(len(inspect.stack()))
x = x + 1
if x < t:
test_(x=x, t=t)
print(test_(0, 7))

输出:

22
23
24
25
26
27
28
None

我的问题是在连接不良的情况下向某些 API 发送请求。这是一个使用bot.polling()方法的库,所以可能是请求溢出或其他什么。

最新更新