【发布时间】: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