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 程式使用的常量完全相同。
Unix 手冊頁 getrlimit(2) 列出了可用資源。請注意,並非所有系統都使用相同的符號或相同的值來表示相同的資源。此模組不嘗試掩蓋平臺差異——未為平臺定義的符號將在此模組中在該平臺上不可用。
- 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_SBSIZE¶
此使用者套接字緩衝區使用的最大大小(以位元組為單位)。這限制了網路記憶體量,從而限制了此使用者在任何時候可以持有的 mbuf 數量。
可用性:FreeBSD、NetBSD。
在 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 版本加入。