Состояние гонки при изменении размера изображения по запросу - PullRequest
0 голосов
/ 27 февраля 2012

Размер ваших изображений изменяется в зависимости от запроса, с учетом предварительно определенной предустановки, которая затем добавляется к имени файла изображений с измененным размером и сохраняется в том же каталоге. Как вы справляетесь с состоянием гонки в случае, когда два запроса вытягивают одно и то же изображение во время изменения размера?

Предлагаемое решение:

import os
import time

import my_threadsafe_cache_module as cache
from my_image_resizer import resize_by_preset_name


def resize_on_demand(preset, original_image_filepath, *args, **kwargs):
    """
    Args:
        preset: A string containing the name of your pre-defined preset.
        original_image_filepath: A string containing the original filepath.
        args, kwargs: Passed to resize_by_preset_name
    """
    resized_filename = ('_' + preset).join(os.path.splitext(original_image_filepath))
    if os.path.exists(resized_filename):
        return resized_filename

    # If the image does not exist, we shall create the resized version.
    cache_key = cache.get('RESIZE_' + resized_filename) # Should return None or True
    if cache_key is None:
        try: # Ensure that the cache key is always deleted
            cache.set('RESIZE_' + resized_filename, True, 5) # 5 indicates seconds
            resize_by_preset_name(preset, original_image_filepath, *args, **kwargs)
        finally:
            cache.delete('RESIZE_' + resized_filename) # Delete the cache key
    else: # We wait until cache_key is not None
        while cache_key is not None:
            time.sleep(1)
            cache_key = cache.get('RESIZE_' + resized_filename)

    return resized_filename

Это правильный подход? Какие были бы возможные подводные камни?

...