我想用Python知道本地机器上cpu的数量。当使用一个优化伸缩的仅用户空间的程序调用时,结果应该是user/real作为时间(1)的输出。


当前回答

这可能适用于我们这些使用不同操作系统的人,但想要获得所有世界的最好:

import os
workers = os.cpu_count()
if 'sched_getaffinity' in dir(os):
    workers = len(os.sched_getaffinity(0))

其他回答

如果你没有Python 2.6,另一个选择:

import commands
n = commands.getoutput("grep -c processor /proc/cpuinfo")

另一种选择是使用psutil库,它在这些情况下总是很有用:

>>> import psutil
>>> psutil.cpu_count()
2

这应该可以在psutil支持的任何平台上工作(Unix和Windows)。

注意在某些情况下多处理。cpu_count可能引发NotImplementedError,而psutil将能够获得cpu的数量。这只是因为psutil首先尝试使用多处理所使用的相同技术,如果这些技术失败,它还会使用其他技术。

如果您正在寻找打印系统中的核数。

试试这个:

import os 
no_of_cores = os.cpu_count()
print(no_of_cores)

这应该会有所帮助。

Len (os.sched_getaffinity(0))是您通常需要的

https://docs.python.org/3/library/os.html#os.sched_getaffinity

os.sched_getaffinity(0)(在Python 3中添加)返回考虑sched_setaffinity Linux系统调用的可用cpu集,该调用限制了进程及其子进程可以在哪些cpu上运行。

0表示获取当前进程的值。该函数返回一组允许使用的cpu(),因此需要使用len()。

另一方面,multiprocessing.cpu_count()和os.cpu_count()只返回物理cpu的总数。

这种差异尤其重要,因为某些集群管理系统(如Platform LSF)使用sched_getaffinity限制作业CPU的使用。

因此,如果您使用multiprocessing.cpu_count(),您的脚本可能会尝试使用比可用内核更多的内核,这可能会导致过载和超时。

通过限制与任务集实用程序的亲和性,我们可以看到具体的区别,它允许我们控制进程的亲和性。

最小任务集示例

例如,如果在我的16核系统中,我将Python限制为1个核心(核心0):

taskset -c 0 ./main.py

使用测试脚本:

main.py

#!/usr/bin/env python3

import multiprocessing
import os

print(multiprocessing.cpu_count())
print(os.cpu_count())
print(len(os.sched_getaffinity(0)))

那么输出为:

16
16
1

Vs nproc

Nproc默认情况下尊重亲缘性,并且:

taskset -c 0 nproc

输出:

1

man nproc把这一点说得很清楚:

打印可用的处理单元数量

因此,len(os.sched_getaffinity(0))在默认情况下的行为类似于nproc。

nproc有——all标志,在不太常见的情况下,你想要获得物理CPU计数而不考虑任务集:

taskset -c 0 nproc --all

操作系统。cpu_count文档

操作系统文档。Cpu_count还简要地提到了这个https://docs.python.org/3.8/library/os.html#os.cpu_count

这个数字并不等同于当前进程可以使用的cpu数量。可用cpu的数量可以通过len(os.sched_getaffinity(0))获得。

同样的注释也复制到multiprocessing的文档中。cpu_count: https://docs.python.org/3/library/multiprocessing.html # multiprocessing.cpu_count

在Lib/multiprocessing/context.py下的3.8源代码中,我们也看到了multiprocessing. py。Cpu_count只是转发给os。cpu_count,只是如果os. cpu_count是多处理的,则会抛出异常而不是返回None。cpu_count失败:

    def cpu_count(self):
        '''Returns the number of CPUs in the system'''
        num = os.cpu_count()
        if num is None:
            raise NotImplementedError('cannot determine number of cpus')
        else:
            return num

3.8可用性:具有本机sched_getaffinity函数的系统

这个操作系统唯一的缺点。sched_getaffinity是在Python 3.8之后才出现的。

cpython 3.8似乎只是试图在配置时使用sched_setaffinity函数调用编译一个小型C hello世界,如果没有出现HAVE_SCHED_SETAFFINITY,则该函数可能会丢失:

https://github.com/python/cpython/blob/v3.8.5/configure#L11523 https://github.com/python/cpython/blob/v3.8.5/Modules/posixmodule.c#L6457

psutil.Process().cpu_affinity(): Windows端口号的第三方版本

第三方psutil包(pip install psutil)已在https://stackoverflow.com/a/14840102/895245上提到,但没有提到cpu_affinity函数:https://psutil.readthedocs.io/en/latest/#psutil.Process.cpu_affinity

用法:

import psutil
print(len(psutil.Process().cpu_affinity()))

这个函数的作用与标准库os。在Linux上的sched_getaffinitymask,但是他们也在Windows上实现了它,通过调用GetProcessAffinityMask Windows API函数:

https://github.com/giampaolo/psutil/blob/ee60bad610822a7f630c52922b4918e684ba7695/psutil/_psutil_windows.c#L1112 https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprocessaffinitymask

换句话说:那些Windows用户必须停止懒惰,并发送一个补丁到上游的stdlib:-)

在Ubuntu 16.04, Python 3.5.2中测试。

这将提供超线程CPU计数

multiprocessing.cpu_count () os.cpu_count ()

这些参数提供了虚拟机CPU计数

psutil.cpu_count () numexpr.detect_number_of_cores ()

只有在虚拟机上工作时才重要。