2013-11-25 4 views
23

У меня есть массив (называемый data_inputs), содержащий имена сотен файлов изображений астрономии. Затем эти изображения обрабатываются. Мой код работает и занимает несколько секунд для обработки каждого изображения. Тем не менее, это может сделать только одно изображение в то время, потому что я бегу массив через «для» петли:Python Многопроцессорный цикл for

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

Там нет причин, почему я должен изменить изображение перед любой другой, так это можно использовать все 4 ядра на моей машине, причем каждое ядро ​​работает через цикл for на другом изображении?

Я читал о модуле многопроцессорности, но я не уверен, как его реализовать в моем случае. Я очень хочу получить многопроцессорную работу, потому что в конечном итоге мне придется запускать ее на 10000 изображений.

ответ

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

Примечание: 'os.cpu_count()' был добавлен в Python 3.4. Для 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

На самом деле это связано с ответом Алко, я цитирую его комментарий (см. Блок кода): «proces data_inputs iterable with pool». Таким образом, 'data_inputs' является итерируемым (как в стандартной« карте »). – ponadto

Смежные вопросы