2013-11-25 54 views
23

Yüzlerce astronomi görüntü dosyasının adını içeren bir dizim (data_inputs adı verilen) var. Bu görüntüler daha sonra manipüle edilir. Kodum çalışır ve her görüntüyü işlemek için birkaç saniye sürer. Ben dizi koşuyorum çünkü Ancak, yalnızca içinden bir seferde bir görüntüyü yapabileceği bir döngü 'için': Ben başka önce bir görüntüyü değiştirmek zorunda için hiçbir neden, öyleymiş yokturPython Bir döngü için çoklu işlem yapma

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

Makinemdeki 4 çekirdeğin her bir çekirdeğini for döngüsünden farklı bir görüntüde kullanmak mümkün mü?

Çok işlemcili modül hakkında okudum ama durumumda nasıl uygulanacağından emin değilim. Çalışmak için çok işlemciye ulaşmaya hevesliyim çünkü sonuç olarak bunu 10.000'den fazla görüntüde çalıştırmam gerekecek.

cevap

36

:

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

Kullanmak daha iyi olabilir: 'pool = Havuz (os.cpu_count())' Bu, çoklu işlemeyi kullanmanın daha genel bir yoludur. –

+1

Not: 'os.cpu_count()' Python 3.4'e eklendi. Python 2.x için 'multiprocessing.cpu_count()' işlevini kullanın. – dwj

+2

'Havuz()' ile aynıdır 'Havuz (os.cpu_count()) ' – Tim

13

Sen multiprocessing.Pool kullanabilirsiniz: Sadece multiprocessing.Pool kullanabilirsiniz

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

Burada "data_inputs" ne olduğunu anlamak kuramıyorum. Tanımlamadın. Hangi değeri vermeliyim? –

+0

Aslında alko'nun cevabından kaynaklanıyor, ben onun yorumunu (kod bloğuna bakınız): "data_inputs havuz ile yinelenen süreçler" diye alıntı yapıyorum. Yani 'data_inputs' yinelenebilir (standart 'harita'daki gibi). – ponadto

İlgili konular