2010-11-01 36 views
2

J'ai une machine à 16 cœurs mais ma fonction de redimensionnement n'utilise qu'un seul cœur, ce qui est vraiment inefficace pour un grand répertoire d'images.En Python, étant donné un répertoire d'images en taille réelle, comment puis-je générer des vignettes en utilisant plusieurs processeurs?

def generateThumbnail(self, width, height): 
    """ 
    Generates thumbnails for an image 
    """ 
    im = Image.open(self._file) 
    (detected_width,detected_height) = im.size 

    #Get cropped box area 
    bbox = self.getCropArea(detected_width, detected_height, width, height) 

    #Crop to box area 
    cropped_image = im.crop(bbox) 

    #Resize to thumbnail 
    cropped_image.thumbnail((width, height), Image.ANTIALIAS) 

    #Save image 
    cropped_image.save(self._path + str(width) + 'x' + 
      str(height) + '-' + self._filename, "JPEG") 

Toute aide serait grandement appréciée. Je vous remercie.

Répondre

5

Cela ressemble à une bonne solution pour le module multiprocessing, qui utilise l'interface de thread, mais crée des processus distincts au lieu de threads.

+0

Notez que vous devriez * être * capable de le faire avec des threads réguliers, car les appels PIL sont natifs et peuvent libérer le GIL. Malheureusement, les appels PIL sont inconsistants à ce sujet: le redimensionnement des images libère le GIL, mais la dernière fois que j'ai vérifié, la lecture et l'écriture de JPEG ne le sont pas. Donc, dans ce cas, vous voulez toujours 'multiprocessing', mais seulement comme une solution de contournement pour un bug. –