Индикатор выполнения с длинными веб-запросами - PullRequest
3 голосов
/ 28 мая 2009

В приложении django, над которым я работаю, я только что добавил возможность архивировать несколько файлов (всего 50 МБ) в zip-файл. В настоящее время я делаю это примерно так:

get files to zip
zip all files
send HTML response

Очевидно, это вызывает большое ожидание на второй строке, где файлы сжимаются. Что я могу сделать, чтобы сделать этот процесс намного лучше для пользователя? Хотя лучше всего иметь индикатор выполнения, даже если он просто возвращает статическую страницу с надписью «пожалуйста, подождите» или что-то в этом роде.

Любые мысли и идеи будут любимы.

Ответы [ 4 ]

4 голосов
/ 28 мая 2009

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

Поместите задачу архивирования в очередь и выполните ее обратный вызов, чтобы как-то уведомить пользователя - например, по электронной почте - о завершении процесса.

Взгляните на Джанго-линейка

Ваш код будет выглядеть примерно так:

from lineup import registry
from lineup import _debug

def create_archive(queue_id, queue):
    queue.set_param("zip_link", _create_archive(resource = queue.context_object, user = queue.user))
    return queue


def create_archive_callback(queue_id, queue):
    _send_email_notification(subject = queue.get_param("zip_link"), user = queue.user)
    return queue

registry.register_job('create_archive', create_archive, callback = create_archive_callback)

В ваших представлениях создавайте задачи в очереди с помощью:

    from lineup.factory import JobFactory
    j = JobFactory()
    j.create_job(self, 'create_archive', request.user, your_resource_object_containing_files_to_zip, { 'extra_param': 'value' })

Затем запустите процессор очереди (возможно, внутри сеанса экрана):

./manage.py run_queue

Да, и по этому вопросу вас также может заинтересовать оценка времени создания zip-файла . Там я получил довольно приятные ответы.

1 голос
/ 28 мая 2009

Забавный факт: вы можете использовать индикатор выполнения, чтобы заставить пользователей думать, что дела идут быстрее, чем они есть на самом деле.

http://www.chrisharrison.net/projects/progressbars/index.html

0 голосов
/ 28 мая 2009

Вы можете использовать «log-файл» для отслеживания заархивированных файлов и того, сколько файлов еще осталось.

Процедурный путь должен быть таким:

  1. Подсчитать номера файлов, записать их в текстовый файл в формате, подобном totalfiles.filespreocessed
  2. Каждый файл zip, просто обновите файл

Итак, если вам нужно сжать 3 файла, файл журнала будет увеличен как:

3.0 -> begin, no file still processed
3.1 -> 1 file on 3 processed, 33% task complete
3.2 -> 2 file on 3 processed, 66% task complete
3.3 -> 3 file on 3 processed, 100% task complete

А затем с помощью простой функции AJAX (интервал) проверять файл журнала каждую секунду.

В Python открытие, чтение и сбор файла такого маленького размера должны быть очень быстрыми, но, возможно, может вызвать проблемы с некоторыми запросами, если у вас будет много пользователей, делающих это одновременно, но, очевидно, вам нужно будет файл журнала для каждого запроса, возможно с именем rand, и удалите его после завершения задачи.

Проблема может заключаться в том, что для того, чтобы ajax мог прочитать файл журнала, вам нужно будет открывать и закрывать обработчик файла в python при каждом его обновлении.

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

0 голосов
/ 28 мая 2009

Лучше, чем статическая страница, покажите диалоговое окно Javascript (используя Shadowbox, JQuery UI или некоторый пользовательский метод) с троббером (вы можете получить его на hxxp: //www.ajaxload.info/) Вы также можете показать пульсатор на своей странице, без диалогов. Большинство пользователей хотят знать только, что их действие обрабатывается, и могут жить без достоверной информации о ходе выполнения («Пожалуйста, подождите, это может занять некоторое время ...»)

В JQUery UI также есть индикатор выполнения API. Вы можете периодически отправлять запросы AJAX на заданную вами страницу на своем веб-сайте, чтобы получать отчет о ходе работы и соответствующим образом изменять индикатор выполнения. В зависимости от того, как часто выполняется архивирование, сколько пользователей может его запустить и как вы аутентифицируете своих пользователей, это может быть довольно сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...