Есть у меня интернет-магазин на Django. Он периодически получает от 1С json-файл с каталогом товаров и кучу jpeg'ов с фотографиями этих товаров. Файл надо распарсить и загрузить данные в базу, а для каждой фотографии сделать по 5 штук миниатюр. Естественно, что считать объёмное изображение с диска, 5 раз масштабировать и 5 раз записать обратно на диск - существенно дольше, чем записать в базу данные из словаря. Кроме того, их там может быть до 200 000. Разумно было вынести создание миниатюр в отдельные потоки.
Функция выполняющаяся в отдельном потоке:
def create_previews(file_path):
file_name = os.path.basename(file_path)
gallery_path = os.path.join(settings.MEDIA_ROOT, 'images')
for size in settings.PREVIEW_SIZES:
prefix = '%dx%d_' % size
preview_path = os.path.join(gallery_path, prefix + file_name)
if not os.path.exists(preview_path):
try:
img = Image.open(file_path)
if (img.size[0] < size[0]) and (img.size[1] < size[1]):
continue
canvas = Image.new("RGB", size, (255,255,255))
preview = ImageOps.fit(img, size, Image.ANTIALIAS)
canvas.paste(preview, (0,0))
canvas.save(preview_path, optimize=True)
except Exception as e:
pass
И в коде, разбирающем json файл, для каждой фотографии, сохранённой в БД:
t = Thread(target=create_previews, args=(image.data.path,))
t.start()