簡體   English   中英

Python多處理失敗,例如代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM