如何在python中增加堆栈大小

Phi*_*oin 8 python dll stack

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

我想增加堆栈大小以摆脱这个错误.有没有办法做到这一点?

zda*_*dan 7

python 线程模块允许您为新线程指定新的堆栈大小.尝试将其设置为您认为足够大的值,然后在新线程中执行此DLL的工作.


Ste*_*ein 5

正如这里的一些相关问题所指出的,使用堆栈大小来扩展递归深度通常不是一个好主意,但这里的代码显示了如何将堆栈增长到这种效果。使用 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()
Run Code Online (Sandbox Code Playgroud)


And*_*Dog 2

AFAIK 程序只能更改新线程或进程的堆栈大小(例如Windows 的CreateThread函数)。由于 Python(以及 Python 的 Win32 API)不公开此类功能,因此您应该用堆内存替换堆栈分配。或者有使用堆栈的具体原因吗?如果您确实必须使用,alloca您可能需要创建一个单独的线程来执行 DLL 代码(我认为这是多余的)。

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