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上å�´ä¸�能。