如何在Python中增加栈大小

12 投票
4 回答
14764 浏览
提问于 2025-04-15 18:02

我有一个用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()
10

Python的线程模块让你可以为新线程设置一个新的栈大小。你可以试着把这个值设置得大一些,然后在一个新线程中执行这个DLL的工作。

2

据我所知,一个程序只能改变新线程或进程的栈大小(比如Windows的CreateThread函数)。因为Python(以及Python的Win32 API)没有提供这样的功能,所以你应该考虑用堆内存来替代栈内存。或者,你有特别的理由非得使用栈吗?如果你真的必须使用alloca,你可能需要为执行DLL代码创建一个单独的线程(不过我觉得这有点过头了)。

编辑:更正一下 - Python确实允许在创建新线程时设置栈大小(见thread.stack_size

撰写回答