Multitraitement d'une boucle for?

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

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

Il n'y a aucune raison pour laquelle je dois modifier une image avant toute autre, est-il donc possible d'utiliser tous les 4 cœurs sur ma machine avec chaque cœur traversant la boucle for sur un autre de l'image?

J'ai lu sur le module multiprocessing mais je ne sais pas comment l'implémenter dans mon cas. Je suis impatient de faire fonctionner multiprocessing parce que finalement je vais devoir l'exécuter sur plus de 10 000 images.

34
demandé sur martineau 2013-11-25 15:09:12

3 réponses

Vous pouvez simplement utiliser 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)  # process data_inputs iterable with pool
46
répondu alko 2018-05-13 20:38:02

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()
16
répondu ixxo 2016-06-08 23:40:14

Sinon

with Pool() as pool: 
    pool(fits.open, [name + '.fits' for name in datainput])
0
répondu Spas 2018-07-29 16:08:46