Я пытаюсь узнать, как использовать многопроцессорную работу с 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:\path\to\thumbs'
PATH = r'c:\path\to\directories\with\photos
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()
Код работает и создает 9 000 миниатюр в нужном месте. Когда я закомментирую create_thumbnail (_path) и откомментирую многопроцессорный код, код повторяет структуру каталогов в два раза быстрее, но не создает никаких миниатюр. Как мне настроить многопроцессорный код, чтобы он работал?