2017-02-28 147 views
0

假設我創建了一個具有2維numpy數組的對象A作爲屬性。然後我使用Process API創建了10個線程來隨機設置A的行。我想知道如果我編寫以下代碼,是否在所有Process(線程)之間共享self.x,或每個Process(線程)只有一個副本?共享numpy數組的Python多處理

如果不共享,我將失去所有更新,對不對?

import numpy as np 
from multiprocessing import Process 

class A: 

    def __init__(): 
     self.x = np.zeros((3,4)) 

    def update(): 
     threads = [] 
     for i in range(10): 
      trd = Process(target=self.set, args=(i,)) 
     threads.append(trd) 
     trd.start() 

     for i in range(10): 
      threads[i].join() 

    def set(i): 
     self.x[i/3] = np.random.rand(1,4) 


if ___main___: 
     a = A() 
     a.update() 

回答

0

不,它不共享。您生成多個進程,每個進程複製父進程的文件描述符,並與共享對象。

要創建共享共享變量,請使用ctype對象。的

所以不是聲明數組 -

from multiprocessing import Array 
self.x = Array('i', [0]*10) 

如果你仍然想使numpy的陣列共享的陣列,看看 -

self.x = np.zeros((3,4)) 

您可以使用此Array聲明它在這個偉大的answer

這裏的警告是,它可能並不那麼容易。您還必須鎖定共享數組以避免任何競爭條件。