[英]Python multiprocessing Pool returns same output in for loop
我正在Windows 10計算機上通過Spyder 3.6.5在Python 3.6中使用multiprocessing.Pool。 目的是通過導入多個輸入來從簡單的平方函數中獲得輸出(在此示例中,針對實際問題僅包含4個值)。 下面的代碼工作正常:
import numpy as np
import multiprocessing
from multiprocessing import Pool
data=[]
data.append(np.array([1,2]))
data.append(np.array([4,5]))
Output=np.zeros((2,2))
for i in range (0,2):
data1=data[i]
def square(x):
return x*x
if __name__ == '__main__':
__spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)"
with Pool(multiprocessing.cpu_count()) as p:
output = p.map(square, data1, chunksize=10)
p.close()
output=np.asarray(output)
Output[i]=output
而當我想將輸入平方函數值(x)指定為:
def square(ii):
x=data1[ii]
return x*x
for循環運行了兩次(由於'for i in range(0,2)'),但是p.map的結果在每次運行中都是相同的,並且等於第二次運行,即,而不是Output = np.array ([[1,4],[16,25]])我正在得到Output = np.array([[16,25],[16,25]])。 似乎for循環在i = 1時運行了兩次,而不是在第一個循環i = 0和在第二個i = 1中運行。
關於我在做什么錯的任何想法?
python中的閉包不會復制它們關閉的變量的值。 他們只是引用該范圍。 在您的第二次嘗試中, square
函數正在訪問data1
,就好像兩次迭代中的值都是不同的一樣,但實際上它是對相同基礎變量的引用。 等到多處理模塊啟動新進程並調用square
,變量已經更改。
嘗試例如:
res = []
for i in range(5):
def square():
return i * i
res.append(square)
print([f() for f in res])
對於解決方案,您可以在每次迭代中手動創建一個具有適當值的新范圍。
函數調用會創建一個新的作用域,因此您可以在循環外定義一個幫助器函數
def square_creater(data1):
def square(ii):
x = data1[ii]
return x * x
return square
然后在每次迭代中使用
square = square_creater(data1)
這應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.