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.
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
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()
Sinon
with Pool() as pool:
pool(fits.open, [name + '.fits' for name in datainput])