python3 递归过深程序崩溃

  1. 延伸下,栈溢出的可能原因

前段时间写了个基于 python 的海量文件上传到 minio server 的脚本

在测试环境下没有问题,但是搬到真实环境下(100多GB的本地文件),程序运行一段时间后崩溃。

我的脚本里定义了 50 个线程一起分工上传,

在查看日志的过程中发现 50 个线程几乎是同时崩溃的,

由于日志太多,导致在排查过程中没找到最关键的日志,我和同事初步判断是 minio 客户端负载太大导致的崩溃

在深入翻查最早报错的日志发现了这句:

{"log":"Fatal Python error: Cannot recover from stack overflow.\n","stream":"stderr"}

错误很明显了,就是我写的代码不合理,递归层级太深导致,后把这段代码改成 while true 后修复问题!

延伸下,栈溢出的可能原因

栈溢出的bug通常出现在 爬虫文件处理 等场景,原理分析:

  • 1.函数递归调用层次过深 ,每调用一次,函数的参数、局部变量等信息就压一次栈,并且没有及时出栈。
  • 2.局部变量体积太大

解决方案

  • 1.把递归调用函数改用while或者for循环来实现。(建议,比如我上面的解决方案
  • 2.通过尾递归优化。
  • 3.改用堆内存,函数里定义很大的局部变量(例如大数组),将局部变量改为静态变量(实质上也是全局变量)。
  • 4.增大栈的大小值。

转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:python3 递归过深程序崩溃

字数:401

本文作者:夏来风

发布时间:2021-01-13, 22:47:12

原始链接:http://www.demo1024.com/blog/python-stack-overflow/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。