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

Difference between multiprocessing.cpu_count and os.cpu_count

osmultiprocessing 模块都定义了一个 cpu_count 函数。

os.cpu_count记录如下:

Return the number of CPUs in the system. Returns None if undetermined.

multiprocessing.cpu_count's documentation说:

Return the number of CPUs in the system. May raise NotImplementedError. See also os.cpu_count()

在我的机器上,它们 return 相同的结果:

>>> 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

那么它们有什么区别呢?我能保证他们总是 return 相同的结果吗? 另外,如果我想为multiprocessing.Pool指定创建多个进程,我应该使用os还是multiprocessing的功能?

答案就在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 的包装。