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下看出效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM