multiprocessing.cpu_count 和 os.cpu_count 的区别

12

无论是 os 模块还是 multiprocessing 模块都定义了一个名为 cpu_count 的函数。

os.cpu_count 的文档如下:

返回系统中的CPU数。 如果无法确定,则返回None。

multiprocessing.cpu_count的文档说:

返回系统中的CPU数。 可能会引发NotImplementedError。 也可参考os.cpu_count()

在我的计算机上,它们都返回相同的结果:

>>> import os
>>> import multiprocessing as mp
>>> os.cpu_count()
8
>>> mp.cpu_count()
8

我本以为multiprocessing.cpu_count只是对os.cpu_count的简单引用,但事实并非如此:

>>> os.cpu_count is mp.cpu_count
False
那么它们之间有什么区别?我能保证它们总是返回相同的结果吗? 此外,如果我想为multiprocessing.Pool指定创建进程的数量,我应该使用os还是multiprocessing的函数?
所以它们之间有什么区别?我能保证它们总是返回相同的结果吗?此外,如果我想为multiprocessing.Pool指定要创建的进程数,我应该使用os还是multiprocessing的函数?
1个回答

16
答案:答案在 multiprocessing.context 中,它定义了 BaseContext.cpu_count 如下所示:
# cpython/Lib/multiprocessing/context.py

class BaseContext(object):
    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

然后,multiprocessing 暴露了这个 cpu_count 方法:

# cpython/Lib/multiprocessing/__init__.py

__all__ = [x for x in dir(context._default_context) if not x.startswith('_')]
globals().update((name, getattr(context._default_context, name)) for name in __all__)

因此,multiprocessing.cpu_count最终只是os.cpu_count的一个包装器。


1
我想补充一下,如果你正在处理打字,使用 mp.cpu_count() 是很有用的,因为在测试中你不必处理 NoneType。 - jwillis0720

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接