【问题标题】:In Python's multiprocessing package, why is there multiprocessing.Pool and multiprocessing.pool.Pool?在 Python 的 multiprocessing 包中,为什么会有 multiprocessing.Pool 和 multiprocessing.pool.Pool?
【发布时间】:2015-10-18 09:06:17
【问题描述】:

在学习 Python 的 multiprocessing 包(用于 Python 3.4)时,我注意到 multiprocessing.Pool 是在 context.py 的类 BaseContext 中定义的。这个定义是

   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())

因此,它最终调用了在pool.py 中定义的multiprocessing.pool.Pool。

为什么multiprocessing 包同时定义multiprocessing.Pool 和multiprocessing.pool.Pool?

【问题讨论】:

  • 也许你可以用你自己的来覆盖它的池管理器?

标签: python multiprocessing pool


【解决方案1】:

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

pool.py 模块包含与创建池相关的代码给定一个 上下文。

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

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 2014-09-13
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多