內置模塊: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
(resource, limits) 設置資源的大小限制,limits必須是格式(soft,hard),soft/hard都必須為整數resource.
prlimit
(pid, resource[, limits])resource.
getrusage
(who) 獲取進程或者線程占用的資源情況resource.
getpagesize
()
resource值可以為:resource.
RLIMIT_CORE
、resource.
RLIM_INFINITY
、resource.
RLIMIT_CPU
、resource.
RLIMIT_FSIZE……
who的值可以為:resource.
RUSAGE_SELF進程自身、
resource.
RUSAGE_CHILDREN子進程
、resource.
RUSAGE_BOTH
、resource.
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下看出效果