# 35.11. `resource` - 资源使用信息

该模块提供用于测量和控制程序利用的系统资源的基本机制。

符号常量用于指定特定的系统资源，并请求关于当前进程或其子进程的使用信息。

在syscall失败时引发`OSError`。

exception `resource.``error`

  已弃用的`OSError`别名。

  在版本3.3中已更改：在 PEP 3151之后，此类被设为`OSError`的别名。

## 35.11.1. Resource Limits

可以使用下面描述的`setrlimit()`函数限制资源使用。每个资源由一对限制控制：软限制和硬限制。软限制是电流限制，并且可以随着时间过程由过程降低或升高。软限制不能超过硬限制。硬限制可以降低到大于软限制的任何值，但不能提高。（只有具有超级用户的有效UID的进程才能引入硬限制。）

可以限制的具体资源是系统相关的。它们在getrlimit（2）手册页中描述。下面列出的资源在底层操作系统支持时支持；不能由操作系统检查或控制的资源在本模块中没有为这些平台定义。

`resource.``RLIM_INFINITY`

  常量用于表示无限资源的限制。

`resource.``getrlimit`(resource)

  使用资源的当前软和硬限制返回元组`（软， 硬）` 如果底层系统调用意外失败，则引发`ValueError`（如果指定了无效资源）或`error`。

`resource.``setrlimit`(resource, limits)

  设置资源的新限制。limits参数必须是描述新限制的两个整数的元组`（soft， hard）` 值`RLIM_INFINITY`可用于请求无限制的限制。

  如果指定了无效的资源，如果新的软限制超过硬限制，或者如果进程尝试引入其硬限制，则引发`ValueError`。当该资源的硬性或系统限制不是无限制时，指定`RLIM_INFINITY`的限制将导致`ValueError`。具有超级用户的有效UID的进程可以请求任何有效的限制值，包括无限的，但是如果所请求的限制超过系统强加的限制，则仍然会引发`ValueError`。

  如果底层系统调用失败，`setrlimit`也可能引发`error`。

`resource.``prlimit`(pid, resource[, limits])

  在一个函数中组合`setrlimit()`和`getrlimit()`，并支持获取和设置任意进程的资源限制。如果pid为0，则调用将应用于当前进程。资源和限制的含义与`setrlimit()`中相同，除了限制是可选的。

  当未给出limit时，函数返回进程pid的资源限制。当给定限制时，设置进程的资源限制，并返回前一个资源限制。

  当用户没有用于进程的`CAP_SYS_RESOURCE`时，当无法找到pid和`PermissionError`时引发`ProcessLookupError` 。

  可用性：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_VMEM`

  过程可能占用的映射内存的最大区域。

`resource.``RLIMIT_AS`

  进程可能占用的地址空间的最大区域（以字节为单位）。

`resource.``RLIMIT_MSGQUEUE`

  可分配给POSIX消息队列的字节数。

  可用性：Linux 2.6.8或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_NICE`

  进程的最高级别的水平（计算为20 - rlim_cur）。

  可用性：Linux 2.6.12或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_RTPRIO`

  实时优先级的上限。

  可用性：Linux 2.6.12或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_RTTIME`

  进程可以在实时调度下花费的CPU时间的时间限制（以微秒为单位），而不会阻塞系统调用。

  可用性：Linux 2.6.25或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_SIGPENDING`

  进程可能排队的信号数。

  可用性：Linux 2.6.8或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_SBSIZE`

  此用户的套接字缓冲区使用的最大大小（以字节为单位）。这限制了此用户可以随时保存的网络内存量，因此限制mbuf的数量。

  可用性：FreeBSD 9或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_SWAP`

  可由此用户ID的所有进程保留或使用的交换空间的最大大小（以字节为单位）。仅当设置了vm.overcommit sysctl的位1时，才会强制执行此限制。有关此sysctl的完整说明，请参阅tuning（7）。

  可用性：FreeBSD 9或更高版本。

  版本3.4中的新功能。

`resource.``RLIMIT_NPTS`

  此用户ID创建的伪终端的最大数量。

  可用性：FreeBSD 9或更高版本。

  版本3.4中的新功能。

## 35.11.2. Resource Usage

这些函数用于检索资源使用信息：

`resource.``getrusage`(who)

  此函数返回描述由当前进程或其子进程消耗的资源的对象，由who参数指定。应使用下面描述的`RUSAGE_*`常量之一指定who参数。

  返回值的字段各自描述特定系统资源如何被使用，例如，花费的运行时间是用户模式或进程被交换出主存储器的次数。一些值取决于内部的时钟节拍，例如。进程正在使用的内存量。

  为了向后兼容，返回值也可以作为16个元素的元组访问。

  返回值的字段`ru_utime`和`ru_stime`分别是表示在用户模式下执行的时间量和在系统模式下执行所花费的时间量的浮点值。其余值为整数。有关这些值的详细信息，请参阅getrusage（2）手册页。简要摘要如下：

  指数 | 领域 | 资源
  --- | --- | ---
  `0` | `ru_utime` | 用户模式下的时间（float）
  `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`

  Pass to `getrusage()` to request resources consumed by both the current process and child processes. 可能不适用于所有系统。

`resource.``RUSAGE_THREAD`

  传递到`getrusage()`以请求当前线程使用的资源。可能不适用于所有系统。

  版本3.2中的新功能。