multiprocessing.cpu_count 和 os.cpu_count 之间的区别
Difference between multiprocessing.cpu_count and os.cpu_count
os
和 multiprocessing
模块都定义了一个 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
的包装。
os
和 multiprocessing
模块都定义了一个 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
的包装。