Python:利用resource限制对系统资源的使用

  • Post author:
  • Post category:python



简介

:当我们在运行Python程序时,如果希望程序所需要的消耗系统资源不能超过一定的量时,例如CPU利用率不能超过50%。可以使用resource。该模块提供测量和控制程序所利用的系统资源的基本机制。


历史攻略:


ubuntu:查看CPU信息、设置程序可用的CPU核心


安装

:需注意在 win 和 mac环境,该模块可能存在问题,建议linux下使用。

pip install resource


案例1

:当超时会产生SIGXCPU信号,程序会自动清理退出。

# -*- coding: utf-8 -*-
# time: 2023/02/18 12:26
# file: main.py
# 公众号: 玩转测试开发
import signal
import resource


def time_exceeded(signo,frame):
    print("运行超时!")
    raise SystemExit(1)


def set_max_runtime(seconds):
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    signal.signal(signal.SIGXCPU, time_exceeded)


if __name__ == '__main__':
    print("程序开始运行。")
    set_max_runtime(10)
    while True:
        pass


运行结果:

(base) [root@ci4vyvxi572ysx2s write]# python main.py 
程序开始运行。
运行超时!


案例2

:当达到设定的内存限制后,如果没有更多的内存可以使用,程序会产生MemoryError异常。

# -*- coding: utf-8 -*-
# time: 2023/02/18 12:26
# file: main.py
# 公众号: 玩转测试开发
import signal
import resource


def time_exceeded(signo,frame):
    print("运行超时!")
    raise SystemExit(1)


def limit_memory(maxsize):
    soft,hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS,(maxsize,hard))

def set_max_runtime(seconds):
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    signal.signal(signal.SIGXCPU, time_exceeded)


if __name__ == '__main__':
    print("程序开始运行。")
    #set_max_runtime(10)

    limit_memory(5)
    loop = 1000
    result = sum([i for i in range(loop)])
    print("程序运行结束。")


运行结果1:

base) [root@ci4vyvxi572ysx2s write]# python main.py 
程序开始运行。
程序运行结束。


当把 loop 改大,如:loop =1000000,重新运行。


运行结果2:

(base) [root@ci4vyvxi572ysx2s write]# python main.py 
程序开始运行。
Traceback (most recent call last):
  File "/home/write/main.py", line 30, in <module>
    result = sum([i for i in range(loop)])
  File "/home/write/main.py", line 30, in <listcomp>
    result = sum([i for i in range(loop)])
MemoryError


参数解析:主要使用resource.RLIMIT_CPU、resource.RLIMIT_AS

resource.RLIMIT_CORE
当前进程可以创建的核心文件的最大大小(以字节为单位)。如果需要更大的核心文件来包含整个进程的镜像,这可能会导致创建一个部分核心文件。

resource.RLIMIT_CPU
一个进程可以使用的最大处理器时间(以秒为单位)。如果超过了这个限制,一个 SIGXCPU 信号将被发送给进程。(参见 signal 模块文档,了解如何捕捉这个信号并做一些有用的事情,例如,将打开的文件刷新到磁盘上)。

resource.RLIMIT_FSIZE
进程可能创建的文件的最大大小。

resource.RLIMIT_DATA
进程的堆的最大大小(以字节为单位)。

resource.RLIMIT_STACK
当前进程的调用堆栈的最大大小(字节)。这只影响到多线程进程中主线程的堆栈。

resource.RLIMIT_RSS
应该提供给进程的最大常驻内存大小。

resource.RLIMIT_NPROC
当前进程可能创建的最大进程数。

resource.RLIMIT_NOFILE
当前进程打开的文件描述符的最大数量。

resource.RLIMIT_OFILE
BSD 对 RLIMIT_NOFILE 的命名。

resource.RLIMIT_MEMLOCK
可能被锁定在内存中的最大地址空间。

resource.RLIMIT_VMEM
进程可能占用的最大映射内存区域。

resource.RLIMIT_AS
进程可能占用的地址空间的最大区域(以字节为单位)。

resource.RLIMIT_MSGQUEUE
可分配给 POSIX 消息队列的字节数。



版权声明:本文为hzblucky1314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。