Python 示例代码的多处理失败
Python multiprocessing fails for example code
我只是尝试将多处理应用到以列表理解形式编写的循环,如下所述:How to parallelize list-comprehension calculations in 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]
所以,到目前为止,这一切看起来都很合理。但是当我在上面链接的接受的答案中执行 Mahmoud 给出的行时:
>>> 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 Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\Program Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "C:\Program Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\pool.py", line 102, in worker
task = get()
File "C:\Program Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\queues.py", line 376, in get
return recv()
AttributeError: 'module' object has no attribute 'square'
Process PoolWorker-5:
...这需要整个控制台。
我不知道为什么这行不通,这似乎是一个非常简单的示例,并且 'square' 确实已定义并且有效,如 map()
的测试所示。我是否忽略了一些如此明显以至于其他人甚至都没有提及的事情?或者特定于版本的东西?
我在 Windows 7 professional 上使用 Python 2.7.6(准确地说是 Winpython 64),这发生在 Spyder 和独立 Python安慰。
这些都是错误的:
1:交互式控制台
正如 user1514631 指出的那样,多处理 cannot run in an interactive interpreter。这对我的编程方式来说很痛苦(这涉及在解释器中编写一半的脚本,然后将正确的代码粘贴到脚本中)
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))
我只是尝试将多处理应用到以列表理解形式编写的循环,如下所述:How to parallelize list-comprehension calculations in 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]
所以,到目前为止,这一切看起来都很合理。但是当我在上面链接的接受的答案中执行 Mahmoud 给出的行时:
>>> 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 Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\Program Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "C:\Program Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\pool.py", line 102, in worker
task = get()
File "C:\Program Files\WinPython-64bit-2.7.6.3\python-2.7.6.amd64\lib\multiprocessing\queues.py", line 376, in get
return recv()
AttributeError: 'module' object has no attribute 'square'
Process PoolWorker-5:
...这需要整个控制台。
我不知道为什么这行不通,这似乎是一个非常简单的示例,并且 'square' 确实已定义并且有效,如 map()
的测试所示。我是否忽略了一些如此明显以至于其他人甚至都没有提及的事情?或者特定于版本的东西?
我在 Windows 7 professional 上使用 Python 2.7.6(准确地说是 Winpython 64),这发生在 Spyder 和独立 Python安慰。
这些都是错误的:
1:交互式控制台
正如 user1514631 指出的那样,多处理 cannot run in an interactive interpreter。这对我的编程方式来说很痛苦(这涉及在解释器中编写一半的脚本,然后将正确的代码粘贴到脚本中)
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))