我只是尝试将多处理应用到一个循环中,这个循环写为列表推导式,如下所述:如何在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))