могу создавать эскизы с помощью PIL, но мой многопроцессорный код не создает эскизы PIL

#python #multiprocessing #python-imaging-library

#python #многопроцессорная обработка #python-imaging-library

Вопрос:

Я пытаюсь научиться использовать многопроцессорную обработку с помощью PIL, используя python 2.7 на 64-разрядном ПК с Windows 7.

Я могу успешно создать (и сохранить) эскизы с помощью PIL в нужном месте на моем компьютере. Когда я пытаюсь реализовать многопроцессорную обработку, мой код не создает никаких эскизов и перебирает файлы примерно в два раза быстрее. У меня около 9000 файлов изображений в нескольких каталогах и подкаталогах (я не могу контролировать имена файлов, а не структуру каталогов)

вот основа кода, который работает.

 from multiprocessing import Pool, freeze_support
import os
from fnmatch import fnmatch
from timeit import default_timer as timer
from PIL import Image, ImageFile

starttime = timer()

SIZE = (125, 125)
SAVE_DIRECTORY = r'c:pathtothumbs'
PATH = r'c:pathtodirectorieswithphotos

def enumeratepaths(path):
    """ returns the path of all files in a directory recursively"""

def create_thumbnail(_filename):
    try:
        ImageFile.LOAD_TRUNCATED_IMAGES = True
        im = Image.open(_filename)
        im.thumbnail(SIZE, Image.ANTIALIAS)
        base, fname = os.path.split(_filename)
        outfile = os.path.split(_filename)[1]   ".thumb.jpg"
        save_path = os.path.join(SAVE_DIRECTORY, outfile)
        im.save(save_path, "jpeg")
    except IOError:
        print " cannot create thumbnail for ... ",_filename


if __name__ == '__main__':
    freeze_support() # need this in windows; no effect in *nix

    for _path in enumeratepaths(PATH):
        if fnmatch(_path, "*.jpg"):
            create_thumbnail(_path)
            # pool = Pool()
            # pool.map(create_thumbnail, _path)
            # pool.close()
            # pool.join()
  

Код работает и создает 9000 эскизов в нужном месте. Когда я закомментирую create_thumbnail(_path) и отменяю комментарий к многопроцессорному коду, код проходит через структуру каталогов в два раза быстрее, но не создает никаких эскизов. Как бы мне настроить многопроцессорный код, чтобы он работал?

Комментарии:

1. Я поиграл и поискал еще немного … по странной причине выбранный каталог не принимает эскизы, и код «pool.map(create_thumbnail, _path)» должен быть pool.map(create_thumbnail(_path), _path) для создания эскизов (после указания каталога сохранения в новое местоположение)

Ответ №1:

код «pool.map(create_thumbnail, _path)» должен быть pool.map(create_thumbnail(_path), _path) для создания эскизов

Комментарии:

1. код работает … время создания 9000 эскизов из сетевого хранилища с помощью многопроцессорной обработки составило 12 235 секунд… время обработки одних и тех же изображений без многопроцессорной обработки 9,537 секунд … не уверен, почему многопроцессорная обработка заняла больше времени