Подтвердить что ты не робот

Python Многопроцессорный цикл for

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

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

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

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

4b9b3361

Ответ 1

Вы можете просто использовать 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

Ответ 2

Вы можете использовать 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()