2014-10-09 132 views
0

我有一個函數使用Python多處理池的功能

def dist_to_center(ra_center,dec_center): 
    # finding theta 
    cos_ra = np.cos(ra_center-var1['ra']) 
    cos_dec = np.cos(dec_center-var1['dec']) 
    sin_dec = np.sin(dec_center)*np.sin(var1['dec']) 

    theta = np.arccos((cos_ra*cos_dec)+sin_dec*(1-cos_ra)) 
    numerator = theta*comoving_dist 
    denominator = 1+var1['zcosmo'] 

    # THE FINAL CALCULATED DISTANCE TO CENTRE 
    dist_to_center = (numerator/denominator) 
    return dist_to_center 

我想利用我的處理器,所以我用multiprocess pool這樣的:

if __name__ == '__main__': 
    pool = Pool(processes=6) 
    pool.map(dist_to_center, ra_center, dec_center) #calling the function with it's inputs 
    pool.close() 
    pool.join() 

的代碼似乎是正確和正在工作,但只有一個處理器正在運行,而不是已調用的6個處理器。我在這裏做錯了什麼?

+0

什麼是'ra_center.shape'和'dec_center.shape'? – 2014-10-09 11:57:30

+0

它們的值都是相同的,例如443726 – user3397243 2014-10-09 11:58:36

+0

你說'ra_center'和'dec_center'是你調用'pool.map()'時的一維數組嗎? – 2014-10-09 12:01:27

回答

1

您正在向池中傳遞一對一維數組。您需要自己切分數組,以使Pool瞭解如何有效地處理它們。例如:

def dist_to_center_mapper(arrays): 
    return dist_to_center(arrays[0], arrays[1]) 

ra = np.split(ra_center, 6) 
dec = np.split(dec_center, 6) 
pool = Pool(processes=6) 
pool.map(dist_to_center_mapper, zip(ra, dec)) 

我覺得是需要的「映射」功能,因爲Pool.map()只需論據單一迭代。因此,我們將兩個數組切片列表一起壓縮,以便將它們一起分配到多個進程。請注意,如果您需要的話,您可以將數組拆分爲更多的部分,如果某些部分可能需要不同的時間量等。

+0

所以我只需要創建一個名爲'dist_to_center_mapper'的新函數並在'pool.map'中調用該函數來使其工作? – user3397243 2014-10-09 12:22:28

+0

就是這樣,因爲我認爲Pool.map想調用一個採用單個參數的函數。你也可以編輯現有的函數來獲取單個參數。它收到的參數將是一個包含兩個子數組的元組,所以你可以看到爲什麼我的「mapper」函數完成它的功能。 – 2014-10-09 12:24:33

+0

我通過分割數組來嘗試上述方法,但仍然只有一個處理器似乎在運行!我想提到的是,我的函數中的所有數組都是形狀爲443726的numpy數組。我的函數只是做了一些數學來給我一個距離。我可以只說'def dist_to_center()' – user3397243 2014-10-09 12:28:13