如何在python中增加堆栈大小

时间:2010-01-14 21:17:02

标签: python dll stack

我有一个使用自定义DLL的python程序。由于堆栈溢出,此DLL崩溃。这种溢出不是由于递归函数变坏,而是由于使用alloca()对堆栈进行大量分配。

我想增加堆栈大小以消除此错误。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:7)

python thread module允许您为新线程指定新的stack size。尝试将其设置为您认为足够大的值,然后在新线程中执行此DLL的工作。

答案 1 :(得分:4)

正如一些相关问题like here所述,使用堆栈大小来扩展递归深度通常不是一个好主意,但这里的代码显示了如何将堆栈增长到该效果。使用python 3.5,在Windows 10 x64系统上,它演示了一个非常深的递归,这通常是不可能的(在我的情况下通常允许的递归限制似乎是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 :(得分:2)

dll中的函数无法控制执行时可用的堆栈大小(除非您在库的控制下生成新线程)。

如果dll是自定义的,那么你不能在堆上分配而不是堆栈(或者如果合适的话静态分配),并以这种方式停止问题?

答案 3 :(得分:2)

AFAIK程序只能更改新线程或进程的堆栈大小(例如Windows {CreateThread功能)。由于Python(以及用于Python的Win32 API)不公开此类功能,因此您应该使用堆内存替换堆栈分配。或者是否有使用堆栈的特定原因?如果您真的 使用alloca,您可能想要创建一个单独的线程来执行DLL代码(我认为这样做有点过分了。)

编辑:更正 - Python允许在创建新线程时设置堆栈大小(请参阅thread.stack_size