gpt4 book ai didi

Python:ulimit 和不错的 subprocess.call/subprocess.Popen?

转载 作者:IT老高 更新时间:2023-10-28 21:38:21 28 4
gpt4 key购买 nike

我需要限制使用 subprocess.call 从 python 进程生成的外部命令行应用程序占用的时间和 CPU,主要是因为有时生成的进程会卡住并将 CPU 固定在 99%。

nice 和 ulimit 似乎是执行此操作的合理方法,但我不确定它们如何与子进程交互。

  • 限制类似于:
    • 如果进程耗时超过 60 秒,则终止进程
    • 将其限制为 CPU 的 20%
  • 我想将资源限制应用于子进程,而不是生成子进程的 python 进程。

有没有办法将 nice 和 ulimit 应用于 subprocess.call 生成的进程?有更好的 Python 原生替代品吗?

这是在 linux (ubuntu) 系统上。

最佳答案

使用 preexec_fn 参数来 subprocess.Popen 和资源模块。示例:

parent.py:

#!/usr/bin/env python

import os
import sys
import resource
import subprocess

def setlimits():
# Set maximum CPU time to 1 second in child process, after fork() but before exec()
print "Setting resource limit in child (pid %d)" % os.getpid()
resource.setrlimit(resource.RLIMIT_CPU, (1, 1))

print "CPU limit of parent (pid %d)" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)
p = subprocess.Popen(["./child.py"], preexec_fn=setlimits)
print "CPU limit of parent (pid %d) after startup of child" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)
p.wait()
print "CPU limit of parent (pid %d) after child finished executing" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)

child.py:

#!/usr/bin/env python

import os
import sys
import resource

print "CPU limit of child (pid %d)" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)

parent.py 将 fork 到一个新进程中。在新进程中,它会调用 setlimits(),然后执行 child.py。这意味着资源将在子进程中受到限制,而不是在父进程中。

运行程序时的输出:

./parent.py
CPU limit of parent (pid 17404) (-1, -1)
Setting resource limit in child (pid 17405)
CPU limit of parent (pid 17404) after startup of child (-1, -1)
CPU limit of child (pid 17405) (1, 1)
CPU limit of parent (pid 17404) after child finished executing (-1, -1)

在许多情况下,这比尝试使用 ulimit 更好,因为通过 shell 生成子进程并不总是一个好主意,尤其是因为它经常导致丑陋的参数引用问题。

关于Python:ulimit 和不错的 subprocess.call/subprocess.Popen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1689505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com