在Python的多处理包中,为什么有多处理.Pool和multiprocessing.pool.Pool?

时间:2015-07-28 00:40:55

标签: python multiprocessing pool

在了解Python的multiprocessing包(Python 3.4)时,我注意到multiprocessing.Pool中的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.Poolmultiprocessing.pool.Pool

1 个答案:

答案 0 :(得分:3)

context.py包含依赖于操作系统的代码。 Pool和许多其他值都是 根据是否sys.platform == 'win32'来定义不同。

pool.py模块包含与给定a的Pool 的创建相关的代码 上下文

通过以这种方式组织代码,开发人员设法以与操作系统无关的方式编写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也是。