如何在Python中增加栈大小
我有一个用Python写的程序,它使用了一个自己制作的DLL(动态链接库)。这个DLL出现了崩溃,原因是栈溢出。这个溢出不是因为递归函数出错,而是因为使用了alloca()进行大规模的栈内存分配。
我想增加栈的大小,以解决这个错误。有没有什么办法可以做到这一点?
4 个回答
7
正如一些相关问题中提到的这里,通常不建议通过调整栈大小来增加递归深度。不过,这里有段代码可以展示如何扩展栈的大小来实现这个目的。在我的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()
2
据我所知,一个程序只能改变新线程或进程的栈大小(比如Windows的CreateThread函数)。因为Python(以及Python的Win32 API)没有提供这样的功能,所以你应该考虑用堆内存来替代栈内存。或者,你有特别的理由非得使用栈吗?如果你真的必须使用alloca
,你可能需要为执行DLL代码创建一个单独的线程(不过我觉得这有点过头了)。
编辑:更正一下 - Python确实允许在创建新线程时设置栈大小(见thread.stack_size)