在Python的multiprocessing包中,为什么会有multiprocessing.Pool和multiprocessing.pool.Pool?
In Python's multiprocessing package, why is there multiprocessing.Pool and multiprocessing.pool.Pool?
在了解 Python 的 multiprocessing
包(针对 Python 3.4)时,我注意到 multiprocessing.Pool
定义在 Class BaseContext
在 context.py
。这个定义是
def Pool(self, processes=None, initializer=None, initargs=(),
maxtasksperchild=None):
'''Returns a process pool object'''
from .pool import Pool
return Pool(processes, initializer, initargs, maxtasksperchild,
context=self.get_context())
因此,它最终调用 multiprocessing.pool.Pool
中定义的 pool.py
。
为什么 multiprocessing
包定义了 multiprocessing.Pool
和 multiprocessing.pool.Pool
?
context.py
包含 OS 依赖代码。 Pool
和许多其他值是
根据是否 sys.platform == 'win32'
有不同的定义。
pool.py
模块包含与创建池相关的代码 给定
上下文。
通过以这种方式组织代码,开发人员设法以 OS 不可知的方式编写 pool.py
。例如pool.py中没有if sys.platform ...
语句。
__init__.py
包含:
globals().update((name, getattr(context._default_context, name))
for name in context._default_context.__all__)
__all__ = context._default_context.__all__
将 context._default_context
中的值复制到 multiprocessing
包的命名空间中。这就是 multiprocessing.Pool
的定义方式。
作为 multiprocessing
包的用户,您应该访问池
通过 multiprocessing.Pool
,虽然可以使用
multiprocessing.pool.Pool
也是。
在了解 Python 的 multiprocessing
包(针对 Python 3.4)时,我注意到 multiprocessing.Pool
定义在 Class BaseContext
在 context.py
。这个定义是
def Pool(self, processes=None, initializer=None, initargs=(),
maxtasksperchild=None):
'''Returns a process pool object'''
from .pool import Pool
return Pool(processes, initializer, initargs, maxtasksperchild,
context=self.get_context())
因此,它最终调用 multiprocessing.pool.Pool
中定义的 pool.py
。
为什么 multiprocessing
包定义了 multiprocessing.Pool
和 multiprocessing.pool.Pool
?
context.py
包含 OS 依赖代码。 Pool
和许多其他值是
根据是否 sys.platform == 'win32'
有不同的定义。
pool.py
模块包含与创建池相关的代码 给定
上下文。
通过以这种方式组织代码,开发人员设法以 OS 不可知的方式编写 pool.py
。例如pool.py中没有if sys.platform ...
语句。
__init__.py
包含:
globals().update((name, getattr(context._default_context, name))
for name in context._default_context.__all__)
__all__ = context._default_context.__all__
将 context._default_context
中的值复制到 multiprocessing
包的命名空间中。这就是 multiprocessing.Pool
的定义方式。
作为 multiprocessing
包的用户,您应该访问池
通过 multiprocessing.Pool
,虽然可以使用
multiprocessing.pool.Pool
也是。