在了解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.Pool
和multiprocessing.pool.Pool
?
答案 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
也是。