在 python 脚本中设置堆栈大小

Posted

技术标签:

【中文标题】在 python 脚本中设置堆栈大小【英文标题】:Setting stacksize in a python script 【发布时间】:2011-07-01 00:01:16 【问题描述】:

我正在将 csh 脚本转换为 python 脚本。该脚本调用了一个需要非常大堆栈的内存密集型可执行文件,因此 csh 脚本将堆栈大小设置为无限制:

limit stacksize unlimited

当我尝试在 python 中重现此脚本时,我以非常幼稚的方式执行它们,使用 os.system,例如:

os.system('some_executable')

但我不知道如何告诉操作系统以无限堆栈大小运行这些可执行文件。有没有办法为 python 脚本中的调用指定堆栈大小?我应该使用一些低级系统调用吗?是否有一个模块(类似于shutil)来控制它?

【问题讨论】:

尝试在Stack *** 修正后设置rlimit_stack 可能会导致失败或相关问题。另请参阅红帽 Issue 1463241 【参考方案1】:

您可以通过threading.stack_size() 更改当前进程的堆栈大小,但我不知道这是否会被子进程正确继承。该接口还需要特定的堆栈大小 - “无限”不是一个选项。

【讨论】:

【参考方案2】:

我对以下代码有很好的经验。它不需要任何特殊的用户权限:

import resource, sys
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)

但它似乎不适用于 pypy。

【讨论】:

如果堆栈溢出,sys.setrecursionlimit(10**6) 将使 Python 解释器出现段错误。 请注意,目前资源模块不适用于 Windows 操作系统。 @ofer.sheffer 仍然比使用 os.system 的公认答案更好。 @ThomasAhle 我是getting the error no module named resource @ThomasAhle -1 是什么?你的意思是resource.RLIM_INFINITY【参考方案3】:

如果需要,您可以只使用 shell 的 (u)limit 命令:

os.system('ulimit -s unlimited; some_executable')

或者(可能更好)使用resource.setrlimit:

resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))

【讨论】:

第一个选项对我不起作用;我相信这是因为 os.system 在基本 shell sh 中执行命令,而不是 bash 或 tcsh。但是您的第二个选项正是我所需要的,谢谢。 (我不知道是谁首先建议了setrlimit,所以我授予这个,因为它包含明确的代码。不过,我很感谢大家的回答。 是的,我应该提到 - 一些 shell 使用限制,一些使用 ulimit,一些允许两者;显式调用是一个更好的主意。【参考方案4】:

您正在寻找 Python setrlimit 接口,resource.RLIMIT_STACK

请注意,标准用户不能提高他们的硬限制,只有 root(嗯,具有CAP_SYS_RESOURCE 能力的进程(参见能力(7))进程可以提高他们的限制;所以您可能需要使用 PAM pam_limits(8 ) limits.conf(5) 文件以提高相关用户的硬性限制。

【讨论】:

以上是关于在 python 脚本中设置堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个线程的基础上限制 Java 的堆栈大小?

在 Bitnami LAMP 堆栈中设置和访问 PHP-FPM 状态页面

如何在 CoreData 的代码中设置 NSManagedObject 与另一个 NSManagedObject 或它们的堆栈的关系?

如何在 hector_localization 堆栈中设置参数以融合 IMU 和气压计(压力传感器)?

ccs5.5怎么看堆栈

Flutter:堆栈中的中心溢出图像