![](/img/trans.png)
[英]Python Official Docs code: Multiprocessing "Lock example" fails to run
[英]Python multiprocessing fails for example code
我只是試圖將多重處理應用於一個以列表理解的形式編寫的循環,如下所述: 如何在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:
...這將帶走整個控制台。 我不知道為什么這不起作用,而且這似乎是一個非常簡單的簡單示例,並且正如對map()
的測試所示,“正方形”的確已定義並起作用。 我是否忽略了如此明顯的東西,以至於其他人甚至都沒有提及? 還是特定於版本的?
我在Windows 7 Professional上使用的是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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.