2013-11-25 178 views
23

我有一個數組(稱爲data_inputs)包含數百個天文圖像文件的名稱。這些圖像然後被操縱。我的代碼工作並需要幾秒鐘來處理每個圖像。但是,它只能在同一時間做一個形象,因爲我跑的陣列通過「for」循環:python多處理for循環

for name in data_inputs: 
    sci=fits.open(name+'.fits') 
    #image is manipulated 

沒有理由爲什麼我在任何其他修改的圖像,因此,它是可以利用我的機器上的所有4個內核,每個內核在不同的映像上運行for循環?

我讀過關於多處理模塊,但我不確定如何在我的情況下實現它。 我很想讓多處理工作,因爲最終我必須在10,000個以上的圖像上運行這個。

回答

36

您可以簡單地使用multiprocessing.Pool

from multiprocessing import Pool 

def process_image(name): 
    sci=fits.open('{}.fits'.format(name)) 
    <process> 

if __name__ == '__main__': 
    pool = Pool()       # Create a multiprocessing Pool 
    pool.map(process_image, data_inputs) # proces data_inputs iterable with pool 
+3

它可能會更好使用: 'pool = Pool(os.cpu_count())' 這是使用多處理的更通用的方法。 –

+1

注意:在Python 3.4中添加了'os.cpu_count()'。對於Python 2.x,使用'multiprocessing.cpu_count()'。 – dwj

+2

'Pool()'與'Pool(os.cpu_count())'相同' – Tim

13

您可以使用multiprocessing.Pool

from multiprocessing import Pool 
class Engine(object): 
    def __init__(self, parameters): 
     self.parameters = parameters 
    def __call__(self, filename): 
     sci = fits.open(filename + '.fits') 
     manipulated = manipulate_image(sci, self.parameters) 
     return manipulated 

try: 
    pool = Pool(8) # on 8 processors 
    engine = Engine(my_parameters) 
    data_outputs = pool.map(engine, data_inputs) 
finally: # To make sure processes are closed in the end, even if errors happen 
    pool.close() 
    pool.join() 
+0

我無法理解什麼是 「data_inputs」 在這裏。你還沒有定義它。我應該給它什麼價值? –

+0

它實際上源於alko的回答,我引用了他的評論(請參閱代碼塊):「處理data_inputs可與池迭代」。所以'data_inputs'是一個可迭代的(就像在一個標準的'map'中)。 – ponadto