python限制进程、子进程占用内存大小、CPU时间的方法:resource模块

内置模块:resource

在mac环境下功能会存在问题。linux下可以使用:但是for i in range(10000)的值必须是10000或者更大的数值才有用。没有搞清楚为什么

#/usr/bin/env python
#-*-coding:utf-8-*-
import resource
#soft,hard=resource.getrlimit(resource.RLIMIT_STACK)
#resource.setrlimit(resource.RLIMIT_STACK,(4,hard))
#soft,hard=resource.getrlimit(resource.RLIMIT_DATA)
#resource.setrlimit(resource.RLIMIT_DATA,(0.002,hard))
soft,hard=resource.getrlimit(resource.RLIMIT_AS)
resource.setrlimit(resource.RLIMIT_AS,(1,hard))   # 理解上,值1表示1字节,程序随便赋个值,内存就会不够用,其实不是这么回事,需要下面循环10000次才有效果
aia=2222222
b='sdfdf似懂非懂辅导辅导'
for i in range(10000):
    a='str'
    a=a+str(i)
    print a
    a=b
    print a

效果:MemoryError

 

 

要限制内存使用,设置可使用的总内存值即可,如下:

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上却不能。

 

主要函数:

  • resource.getrlimit(resource) 获取资源的大小限制
  • resource.setrlimit(resourcelimits) 设置资源的大小限制,limits必须是格式(soft,hard),soft/hard都必须为整数
  • resource.prlimit(pidresource[, limits])
  • resource.getrusage(who) 获取进程或者线程占用的资源情况
  • resource.getpagesize()

resource值可以为:resource.RLIMIT_COREresource.RLIM_INFINITYresource.RLIMIT_CPUresource.RLIMIT_FSIZE……

who的值可以为:resource.RUSAGE_SELF进程自身、resource.RUSAGE_CHILDREN子进程resource.RUSAGE_BOTHresource.RUSAGE_THREAD当前线程

 

Python 内存管理的另一个有趣话题是它的“垃圾回收”机制。它以“引用计数” 为主,并借助“标记-清除”机制消除循环引用带来的影响。为了加速对象的创建,Python 又引入 “分代回收”机制,它缓存部分反复创建和销除的对象,而非在它们释放后直接从内存删除它们, 从而加速下次该对象的创建

 

https://docs.python.org/3.4/library/resource.html

https://python3-cookbook.readthedocs.io/zh_CN/latest/c13/p14_putting_limits_on_memory_and_cpu_usage.html 对应中文:https://www.rddoc.com/doc/Python/3.6.0/zh/library/resource/ 翻译的一般

https://blog.csdn.net/liangyuannao/article/details/9697987 这个例子可以在linux下看出效果

posted @ 2018-12-18 21:27  脚本小娃子  阅读(11927)  评论(0编辑  收藏  举报