【问题标题】:Ways to avoid Stack Overflow error in threads in Python在 Python 中避免线程中的 Stack Overflow 错误的方法
【发布时间】:2012-12-06 23:08:41
【问题描述】:

作为一名原生 Java 开发人员,我想我已经达到了我习惯的境地。

我正在使用 PyDev 开发一个多线程 Python 2.7 应用程序,并在 Windows 7 64 位上从 Eclipse 运行。它是多线程的,因为它使用 wxPython,因此它使用 GUI 主线程和繁重的线程(我或我有一些繁重的任务),每个回调一个线程。

我已经到了在python27.dll 中弹出0xc00000fd 错误并带有appcrash 消息的地步。这发生在线程中的函数返回值时。如果我减少回调正在处理的数据量,那么这段代码可以正常工作,所以我很确定堆栈上的东西太多了,并且没有递归在任何地方出错。

我可以在创建之前在线程上调用stack_size 以增加我可用的空间,如果我要弄清楚有多少空间可以满足它,也许这可以工作一段时间。线程将不得不做更多而不是更少的工作,所以这似乎是一个创可贴的情况。

我认为 Python 使用堆内存创建堆栈,所以这在 Python 中应该不是问题吗?它是我的众多第三方 api 之一,它是真正的罪犯吗?那么,如果没有 C 语言中的低级内存创建决策能力,我如何将其中的一些从堆栈中取出并放入堆内存中?

【问题讨论】:

  • 解释器崩溃显然是相当不正常的。有什么方法可以生成低级崩溃报告,包括堆栈跟踪(我的意思是 CPU 堆栈,而不是 Python 堆栈)、寄存器值、线程等?
  • 作为初步,进入 Visual Studio 2010。我一遍又一遍地看到 multiarray.pyd!00000000052e13b3() 行。也许是 Numpy 或 Numpy/Scipy 交互?最后一行是 python27.dll!000000001e0a0a36。我将尝试深入研究 python 和寄存器等。
  • 查看模块列表,外部有3个:scipy、sklearn和wx-2-8-msw-unicode(即wxPython)。线程列表列出了 7 个线程。线程 ID 6284 与列出的位置 1e0a0077 是它崩溃的地方。在这一点上,我真的在想 Scipy (0.11.0)、Numpy (1.6.2 MLK) 和 64 位 Windows 的组合是什么。

标签: python multithreading stack-overflow


【解决方案1】:

Python should never crash out,如Guido said

我并不是说它是不可破解的。我是说,如果你把它撞倒,它就是 一个错误,除非被证明是轻率的。

因此,如果发生崩溃,则将其视为 Python 本身的错误。这不太可能发生,很可能是您的扩展模块之一做错了事,并使用了 Python。

我的建议是去掉一些东西,直到你确切地找到问题所在。如果它只发生在核心 python 的东西上,那么你需要提交一个错误报告,否则,它需要去找任何扩展模块的开发人员。

【讨论】:

  • 这不是真的。有时递归可能会导致问题,例如酸洗大型物体。 This answer 为我解决了。
猜你喜欢
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2019-10-03
相关资源
最近更新 更多