簡體   English   中英

Python多處理池在for循環中返回相同的輸出

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

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