Python多处理失败,例如代码



我只是尝试将多处理应用到一个循环中,这个循环写为列表推导式,如下所述:如何在Python中并行化列表推导式计算?

初始值按预期工作:

>>> import multiprocessing
>>> try:
...     cpus = multiprocessing.cpu_count()
... except NotImplementedError:
...     cpus = 2   # arbitrary default
... 
>>> 
>>> def square(n):
...     return n * n
... 
>>> pool = multiprocessing.Pool(processes=cpus)
>>> cpus
12

然后,只是为了检查,我没有误解map()的工作原理:

>>> map(square, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

到目前为止,这些看起来都是合理的。但是,当我执行马哈茂德在上面链接的可接受答案中给出的行:

>>> print pool.map(square, range(10))
Process PoolWorker-1:
Process PoolWorker-2:
Process PoolWorker-12:
Process PoolWorker-6:
Process PoolWorker-9:
Process PoolWorker-4:
Process PoolWorker-8:
Process PoolWorker-10:
Process PoolWorker-11:
Traceback (most recent call last):
  File "C:Program FilesWinPython-64bit-2.7.6.3python-2.7.6.amd64libmultiprocessingprocess.py", line 258, in _bootstrap
    self.run()
  File "C:Program FilesWinPython-64bit-2.7.6.3python-2.7.6.amd64libmultiprocessingprocess.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "C:Program FilesWinPython-64bit-2.7.6.3python-2.7.6.amd64libmultiprocessingpool.py", line 102, in worker
    task = get()
  File "C:Program FilesWinPython-64bit-2.7.6.3python-2.7.6.amd64libmultiprocessingqueues.py", line 376, in get
    return recv()
AttributeError: 'module' object has no attribute 'square'
Process PoolWorker-5:   

…这需要整个控制台。我不知道为什么这不会工作,这似乎是一个非常简单的例子,"平方"确实被定义和工作,与map()的测试显示。我是否忽视了一些显而易见的事情,而其他人甚至都没有提到它?或者一些特定于版本的东西?

我在Windows 7专业版上使用Python 2.7.6(准确地说是Winpython 64),这发生在Spyder和独立的Python控制台中。

这些都是错误的:

1:交互式控制台

正如user1514631所指出的,多处理不能在交互式解释器中运行。这对我的编程方式(包括在解释器中编写一半脚本,然后将正确的代码粘贴到脚本中)来说是痛苦的

2: multiprocessing.freeze_support()

这在Windows上是必需的,否则我会让所有cpu生成关于不使用它的警告消息,一旦工作池被定义(在我分配任何事情之前)

3: if __name__ == "__main__":

我通常把这行放在我的大部分代码中,所以我可以把它作为库使用,也可以不使用,但是这个脚本永远不会被导入,所以我没有它。由于某种原因,我还没有理解,甚至把multiprocessing.freeze_support()语句在脚本的第一行将不起作用。它必须显然有一个if __name__ == "__main__":行,并且直接在它后面,即使multiprocessing只在某些函数中导入或使用。

Windows的工作代码看起来像这样:

def square(n):
    return n * n
if __name__ == "__main__":
    import multiprocessing
    multiprocessing.freeze_support()
    pool = multiprocessing.Pool(processes=5)
    print pool.map(square, range(10))   

最新更新