簡體   English   中英

如何在python多處理中實現reduce操作?

[英]How to implement a reduce operation in python multiprocessing?

我是OpenMP和C ++的專家並行程序員。 現在,我試圖理解python和multiprocessing庫中的並行性。

特別是,我嘗試並行處理此簡單代碼,該代碼將數組隨機遞增100次:

from random import randint
import multiprocessing as mp
import numpy as np

def random_add(x):
    x[randint(0,len(x)-1)]  += 1

if __name__ == "__main__":
    print("Serial")
    x = np.zeros(8)
    for i in range(100):
        random_add(x)
    print(x)

    print("Parallel")
    x = np.zeros(8)    
    processes = [mp.Process(target = random_add, args=(x,)) for i in range(100)]
    for p in processes:
        p.start()
    print(x)

但是,這是以下輸出:

Serial
[  9.  18.  11.  15.  16.   8.  10.  13.]
Parallel
[ 0.  0.  0.  0.  0.  0.  0.  0.]

為什么會這樣? 好吧,我想我有一個解釋:由於我們處於多處理(而不是多線程)中,因此每個進程都屬於自己的內存部分,即每個產生的進程都有自己的x ,一旦random_add(x)為終止。 結論是,主程序中的x從未真正更新過。

這個對嗎? 如果是這樣,我該如何解決這個問題? 簡而言之,我需要一個全局的reduce操作,該操作求和所有random_add調用的結果,以獲得與串行版本相同的結果。

在這種情況下,應使用共享內存對象:

from random import randint
import multiprocessing as mp

def random_add(x):
    x[randint(0,len(x)-1)]  += 1

if __name__ == "__main__":
    print("Serial")
    x = [0]*8
    for i in range(100):
        random_add(x)
    print(x)

    print("Parallel")
    x = mp.Array('i', range(8))
    processes = [mp.Process(target = random_add, args=(x,)) for i in range(100)]
    for p in processes:
        p.start()
    print(x[:])

為了清楚起見,我將numpy數組更改為順序列表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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