在 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 脚本中设置堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章
在 Bitnami LAMP 堆栈中设置和访问 PHP-FPM 状态页面
如何在 CoreData 的代码中设置 NSManagedObject 与另一个 NSManagedObject 或它们的堆栈的关系?