当我们在运行python程序时,如果希望程序所需要的消耗系统资源不能超过一定的量时,例如CPU利用率不能超过N%。可以使用resource。resource 模块用于测量和控制程序使用的系统资源的基本机制。
安装:需注意在 win 和 mac环境,该模块可能存在问题,建议linux下使用。
pip install resource
官方文档:resource --- 资源使用信息 — Python 3.9.17 文档
setrlimit()将和结合getrlimit()在一个函数中,支持获取和设置任意进程的资源限制
import resource
# 进程可用存储区大小
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
# 进程最大处理器时间
soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
# 设置cpu最大处理时间
resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
# 设置进程内存限制,程序运行到没有多余内存时会抛出 MemoryError 异常
resource.setrlimit(resource.RLIMIT_AS, (size, hard))
其他参数值:
import resource
# 资源使用状况:请求调用进程消耗的资源,进程中所有线程使用的资源总和
sor = resource.getrusage(resource.RUSAGE_SELF)
# 已终止和等待的调用进程的子进程消耗的请求资源
sor = resource.getrusage(resource.RUSAGE_CHILDREN)
# 当前进程和子进程消耗的资源 并非在所有系统上都可用
sor = resource.getrusage(resource.RUSAGE_BOTH)
# 当前线程消耗的资源 可能并非在所有系统上都可用
sor = resource.getrusage(resource.RUSAGE_THREAD)
# 用户模式下的时间
print(sor.ru_utime)
其它参数如下:
set_max_ runtime
函数通过调用 resource 模块中的 getrlimit 和 setrlimit 函数来限制 Python 进程的 CPU 时间。函数首先调用 getrlimit 函数获取当前 CPU 时间的软限制和硬限制,然后将软限制设置为指定的时间,将硬限制保持不变。最后,该函数调用 signal 模块中的 signal 函数,安装一个处理超时信号 SIGXCPU 的信号处理程序,该处理程序在超时时打印一条提示信息并引发 SystemExit 异常以终止脚本。
set_max_memory
函数同样使用 getrlimit 和 setrlimit 函数来限制 Python 进程的内存使用量。该函数首先调用 getrlimit 函数获取当前内存使用量的软限制和硬限制,然后将软限制设置为指定的大小,将硬限制保持不变。
import signal
import resource
import os
# 限制 CPU 时间
def time_exceeded(signo, frame):
# 超时时打印提示信息并引发 SystemExit 异常,以终止脚本
print("CPU exceeded...")
raise SystemExit(1)
def set_max_runtime(seconds):
# 获取当前 CPU 时间的软限制和硬限制
soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
# 设置软限制为指定的时间,硬限制不变
resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
# 安装一个信号处理程序来处理超时信号 SIGXCPU
signal.signal(signal.SIGXCPU, time_exceeded)
# 限制内存使用量
def set_max_memory(size):
# 获取当前内存使用量的软限制和硬限制
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
# 设置软限制为指定的大小,硬限制不变
resource.setrlimit(resource.RLIMIT_AS, (size, hard))
参考: