13.14 �制内存和CPU的使用�¶

问题¶

你想对在Unix系统上��行的程�设置内存或CPU的使用�制。

解决方案¶

resource 模�能�时执行这两个任务。例如,��制CPU时间,�以�下�这样�:

import signal
import resource
import os

def time_exceeded(signo, frame):
    print("Time's up!")
    raise SystemExit(1)

def set_max_runtime(seconds):
    # Install the signal handler and set a resource limit
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    signal.signal(signal.SIGXCPU, time_exceeded)

if __name__ == '__main__':
    set_max_runtime(15)
    while True:
        pass

程��行时,SIGXCPU 信�在时间过期时被生�,然�执行清�并退出。

��制内存使用,设置�使用的总内存值��,如下:

import resource

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

�这样设置了内存�制�,程��行到没有多余内存时会抛出 MemoryError 异常。

讨论¶

在本节例�中,setrlimit() 函数被用�设置特定资�上�的软�制和硬�制。 软�制是一个值,当超过这个值的时候�作系统通常会��一个信���制或通知该进程。 硬�制是用�指定软�制能设定的最大值。通常�讲,这个由系统管�员通过设置系统级�数�决定。 尽管硬�制�以改�一点,但是最好��使用用户进程去修改。

setrlimit() 函数还能被用�设置�进程数��打开文件数以�类似系统资�的�制。 更多详情请�考 resource 模�的文档。

需�注�的是本节内容�能适用于Unix系统,并且���所有系统都能如期工作。 比如我们在测试的时候,它能在Linux上�正常�行,但是在OS X上��能。