在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 BaseContextcontext.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.Poolmultiprocessing.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 也是。