resource
— 資源使用資訊¶
該模組提供了用於測量和控制程式使用的系統資源的基本機制。
可用性: Unix,而非 WASI。
使用符號常量來指定特定的系統資源,並請求有關當前程序或其子程序的使用資訊。
在系統呼叫失敗時會引發 OSError
。
資源限制¶
可以使用下面描述的 setrlimit()
函式來限制資源的使用。每個資源都由一對限制控制:軟限制和硬限制。軟限制是當前限制,可能會被程序隨著時間的推移而降低或提高。軟限制永遠不能超過硬限制。硬限制可以降低到任何大於軟限制的值,但不能提高。(只有有效 UID 為超級使用者的程序才能提高硬限制。)
可以限制的具體資源是系統相關的。它們在 getrlimit(2) 手冊頁中進行了描述。當底層作業系統支援時,會支援下列資源;作業系統無法檢查或控制的資源在本模組中不會為這些平臺定義。
- resource.RLIM_INFINITY¶
用於表示無限資源限制的常量。
- resource.getrlimit(resource)¶
返回一個元組
(soft, hard)
,其中包含 resource 的當前軟限制和硬限制。如果指定了無效資源,則引發ValueError
,如果底層系統呼叫意外失敗,則引發error
。
- resource.setrlimit(resource, limits)¶
設定 resource 的新消耗限制。limits 引數必須是一個包含兩個整數的元組
(soft, hard)
,用於描述新的限制。可以使用RLIM_INFINITY
值來請求無限制的限制。如果指定了無效資源,如果新的軟限制超過了硬限制,或者如果程序試圖提高其硬限制,則引發
ValueError
。當該資源的硬限制或系統限制不是無限制的時,指定RLIM_INFINITY
的限制將導致ValueError
。有效 UID 為超級使用者的程序可以請求任何有效的限制值,包括無限制,但如果請求的限制超過系統施加的限制,仍然會引發ValueError
。如果底層系統呼叫失敗,
setrlimit
也可能會引發error
。VxWorks 僅支援設定
RLIMIT_NOFILE
。使用引數
resource
、limits
引發 審計事件resource.setrlimit
。
- resource.prlimit(pid, resource[, limits])¶
將
setrlimit()
和getrlimit()
合併到一個函式中,並支援獲取和設定任意程序的資源限制。如果 pid 為 0,則呼叫將應用於當前程序。resource 和 limits 與setrlimit()
中的含義相同,只是 limits 是可選的。當未給出 limits 時,該函式將返回程序 pid 的 resource 限制。當給出 limits 時,將設定程序的 resource 限制並返回之前的資源限制。
當找不到 pid 時引發
ProcessLookupError
,當用戶沒有該程序的CAP_SYS_RESOURCE
時引發PermissionError
。使用引數
pid
、resource
、limits
引發 審計事件resource.prlimit
。可用性:Linux >= 2.6.36,帶有 glibc >= 2.13。
在 3.4 版本中新增。
這些符號定義了可以使用下面描述的 setrlimit()
和 getrlimit()
函式來控制其消耗的資源。這些符號的值與 C 程式使用的常量完全相同。
getrlimit(2) 的 Unix 手冊頁列出了可用的資源。請注意,並非所有系統都使用相同的符號或相同的值來表示相同的資源。此模組不會嘗試掩蓋平臺差異——對於某個平臺未定義的符號,在該平臺上將不可用於此模組。
- resource.RLIMIT_CORE¶
當前程序可以建立的核心轉儲檔案的最大大小(以位元組為單位)。如果需要更大的核心轉儲檔案來包含整個程序映像,這可能會導致建立部分核心轉儲檔案。
- resource.RLIMIT_CPU¶
程序可以使用的最大處理器時間(以秒為單位)。如果超出此限制,則會向程序傳送
SIGXCPU
訊號。(請參閱signal
模組文件,瞭解如何捕獲此訊號並執行有用的操作,例如將開啟的檔案重新整理到磁碟。)
- resource.RLIMIT_FSIZE¶
程序可以建立的最大檔案大小。
- resource.RLIMIT_DATA¶
程序堆的最大大小(以位元組為單位)。
- resource.RLIMIT_STACK¶
當前程序的呼叫堆疊的最大大小(以位元組為單位)。這僅影響多執行緒程序中主執行緒的堆疊。
- resource.RLIMIT_RSS¶
應提供給程序的最大常駐集大小。
- resource.RLIMIT_NPROC¶
當前程序可以建立的最大程序數。
- resource.RLIMIT_NOFILE¶
當前程序的最大開啟檔案描述符數。
- resource.RLIMIT_OFILE¶
RLIMIT_NOFILE
的 BSD 名稱。
- resource.RLIMIT_MEMLOCK¶
可以在記憶體中鎖定的最大地址空間。
- resource.RLIMIT_AS¶
程序可以佔用的最大地址空間區域(以位元組為單位)。
- resource.RLIMIT_RTTIME¶
程序在沒有進行阻塞系統呼叫的情況下,在即時排程下可以花費的 CPU 時間限制(以微秒為單位)。
可用性: Linux >= 2.6.25。
在 3.4 版本中新增。
- resource.RLIMIT_SBSIZE¶
此使用者套接字緩衝區使用的最大大小(以位元組為單位)。 這限制了網路記憶體量,因此也限制了此使用者隨時可以擁有的 mbuf 數量。
可用性: FreeBSD。
在 3.4 版本中新增。
資源使用情況¶
這些函式用於檢索資源使用資訊
- resource.getrusage(who)¶
此函式返回一個物件,該物件描述了當前程序或其子程序所消耗的資源,具體由 who 引數指定。who 引數應使用下面描述的
RUSAGE_*
常量之一來指定。一個簡單的例子
from resource import * import time # a non CPU-bound task time.sleep(3) print(getrusage(RUSAGE_SELF)) # a CPU-bound task for i in range(10 ** 8): _ = 1 + 1 print(getrusage(RUSAGE_SELF))
返回值的每個欄位都描述了特定系統資源的使用方式,例如,在使用者模式下執行所花費的時間或程序從主記憶體中換出的次數。某些值依賴於時鐘節拍內部,例如程序正在使用的記憶體量。
為了向後相容,返回值也可以作為包含 16 個元素的元組進行訪問。
返回值的欄位
ru_utime
和ru_stime
是浮點值,分別表示在使用者模式下執行所花費的時間和在系統模式下執行所花費的時間。其餘值是整數。有關這些值的詳細資訊,請查閱 getrusage(2) 手冊頁。這裡給出一個簡短的摘要索引
欄位
資源
0
ru_utime
使用者模式下的時間(浮點秒)
1
ru_stime
系統模式下的時間(浮點秒)
2
ru_maxrss
最大常駐集大小
3
ru_ixrss
共享記憶體大小
4
ru_idrss
非共享記憶體大小
5
ru_isrss
非共享堆疊大小
6
ru_minflt
不需要 I/O 的頁面錯誤
7
ru_majflt
需要 I/O 的頁面錯誤
8
ru_nswap
換出次數
9
ru_inblock
塊輸入操作
10
ru_oublock
塊輸出操作
11
ru_msgsnd
已傳送的訊息
12
ru_msgrcv
已接收的訊息
13
ru_nsignals
已接收的訊號
14
ru_nvcsw
自願上下文切換
15
ru_nivcsw
非自願上下文切換
如果指定了無效的 who 引數,此函式將引發
ValueError
。在不尋常的情況下,它還可能引發error
異常。
- resource.getpagesize()¶
返回系統頁中的位元組數。(這不必與硬體頁面大小相同。)
以下 RUSAGE_*
符號被傳遞給 getrusage()
函式,以指定應提供哪個程序的資訊。
- resource.RUSAGE_SELF¶
傳遞給
getrusage()
以請求呼叫程序所消耗的資源,這是程序中所有執行緒使用的資源的總和。
- resource.RUSAGE_CHILDREN¶
傳遞給
getrusage()
,以請求呼叫程序已終止並等待的子程序所消耗的資源。
- resource.RUSAGE_BOTH¶
傳遞給
getrusage()
,以請求當前程序和子程序所消耗的資源。可能並非在所有系統上都可用。
- resource.RUSAGE_THREAD¶
傳遞給
getrusage()
,以請求當前執行緒所消耗的資源。可能並非在所有系統上都可用。在版本 3.2 中新增。