multiprocessing.cpu_count和os.cpu_count之间的区别

时间:2018-11-29 10:47:08

标签: python multiprocessing cpu python-os

osmultiprocessing模块都定义了cpu_count函数。

os.cpu_count记录如下:

  

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

multiprocessing.cpu_count's documentation说:

  

返回系统中的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创建的多个进程,是否应该使用osmultiprocessing的函数?

1 个答案:

答案 0 :(得分:1)

答案位于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

然后,cpu_count公开了此multiprocessing方法:

# 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的包装。