web-dev-qa-db-fra.com

Multi-traitement d'une boucle for?

J'ai un tableau (appelé data_inputs) contenant les noms de centaines de fichiers images d'astronomie. Ces images sont ensuite manipulées. Mon code fonctionne et prend quelques secondes pour traiter chaque image. Cependant, il ne peut créer qu'une image à la fois car j'exécute le tableau via une boucle for:

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

Il n'y a aucune raison pour que je doive modifier une image avant une autre, est-il possible d'utiliser les 4 cœurs de ma machine, chacun passant par la boucle for sur une image différente?

J'ai lu des informations sur le module multiprocessing mais je ne sais pas comment le mettre en œuvre dans mon cas ... Je tiens à faire en sorte que multiprocessing fonctionne, car je devrai éventuellement l'exécuter sur plus de 10 000 images.

38
ChrisFro

Vous pouvez simplement utiliser multiprocessing.Pool :

from multiprocessing import Pool

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

if __== '__main__':
    pool = Pool()                         # Create a multiprocessing Pool
    pool.map(process_image, data_inputs)  # process data_inputs iterable with pool
52
alko

Vous pouvez utiliser 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()
18
ixxo

Alternativement

with Pool() as pool: 
    pool.map(fits.open, [name + '.fits' for name in datainput])
0
Spas