Разница между multiprocessing.cpu_count и os.cpu_count - PullRequest
0 голосов
/ 29 ноября 2018

Оба модуля os и multiprocessing определяют функцию cpu_count.

os.cpu_count задокументировано следующим образом:

Возвратколичество процессоров в системе.Возвращает None, если не определено.

и документация multiprocessing.cpu_count говорит:

Возвращает количество процессоров в системе.Может вызвать 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?

1 Ответ

0 голосов
/ 29 ноября 2018

Ответ лежит в 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.

...