我有一个使用自定义DLL的Python程序。这个DLL由于堆栈溢出而崩溃。这种溢出不是由于递归函数出了问题,而是使用alloca()在堆栈上进行大型分配。
我想增加堆栈大小以消除这个错误。是否有任何方法可以做到这一点?
如一些相关问题(例如此处)所述,更改堆栈大小以扩展递归深度通常不是一个好主意。但以下代码展示了如何增加堆栈以达到这个目的。在Windows 10 x64系统上使用Python 3.5,它展示了一个非常深的递归,这在正常情况下是不可能的(在我的情况下,通常允许的递归限制似乎为993)。我不知道这个例子需要多大的堆栈,但是在我的机器上,如果只有下面指定的大小的一半,则Python会崩溃。
import sys
import threading
class SomeCallable:
def __call__(self):
try:
self.recurse(99900)
except RecursionError:
print("Booh!")
else:
print("Hurray!")
def recurse(self, n):
if n > 0:
self.recurse(n-1)
SomeCallable()() # recurse in current thread
# recurse in greedy thread
sys.setrecursionlimit(100000)
threading.stack_size(0x2000000)
t = threading.Thread(target=SomeCallable())
t.start()
t.join()
当dll中的函数被执行时,它们无法控制可用的堆栈大小(除非您在库的控制下生成新线程)。
如果dll是自定义的,那么您不可以分配堆而不是栈(或静态分配,如果适用),从而停止问题的发生?
alloca
,则可能需要为 DLL 代码执行创建单独的线程(我认为这是过度设计)。
编辑:更正 - Python 允许在创建新线程时设置堆栈大小(请参见 thread.stack_size)