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