2014-02-21 3 views
8

У меня есть сайт Django, а на одной странице есть кнопка (или ссылка), которая при нажатии запускает несколько долгую задачу. Очевидно, что я хочу запустить эту задачу в качестве фоновой задачи и немедленно вернуть результат пользователю. Я хочу реализовать это, используя простой подход, который не потребует от меня установки и изучения целой новой архитектуры обмена сообщениями, например, Celery. Я не хочу использовать сельдерей! Я просто хочу использовать простой подход, который я могу настроить и запустить в течение следующих полчаса или около того. Разве нет простого способа сделать это в Django, не добавляя (еще один) пакет сторонних разработчиков?Простой подход к запуску фоновой задачи в Django

+0

Вы можете просто вернуть сервер на запрос Полученный тип ответа. Тогда, если опрос или веб-сайты не являются опцией, просто установите обновление сервера на процентное значение, возможно, каждые 10% или 25%. И у вас есть определенная область для проверки всеми запущенными процессами и отображения процента завершения. Таким образом, браузер только поражает сервер, когда пользователь переходит к обновленной странице процесса или обновляет ее. Затем, если процесс имеет 100% завершение, есть ссылка на результаты. Просто некоторые идеи. –

+0

Примечание. Сервер, обновляющий процентное значение, находится только на сервере [например, значение DB]. Это может быть запрошено, если пользователь переходит к данной странице. Также это будет зависеть от того, как ваша инфраструктура может обрабатывать параллельные соединения. Ход процесса может блокироваться, поэтому вам может потребоваться изучить нечто вроде торнадо. –

+1

Я очень сомневаюсь, что все, что вы пишете, будет проще, чем просто установить Celery и сделать с ним. –

ответ

4

Просто используйте нить.

import threading 

t = threading.Thread(target=long_process, 
          args=args, 
          kwargs=kwargs) 
t.setDaemon(True) 
t.start() 
return HttpResponse() 

Смотрите этот вопрос для более подробной информации: Can Django do multi-thread works?

1

Если вы готовы установить 3-ю библиотеку партии, но вы хотите что-то гораздо проще, чем сельдерей, проверьте Redis очередь. Это требует Redis, который довольно легко сам по себе, но это также может обеспечить множество других преимуществ.

У самой RQ почти нулевая конфигурация. Это потрясающе просто.

Ссылки:

5

Посмотрите на django-background-tasks - это именно то, что вам нужно, и не нуждается в какой-либо дополнительные сервисы, которые будут работать как RabbitMQ или Redis. Он управляет очередью задач в базе данных и имеет команду управления Django, которую вы можете запускать один раз или как задание cron.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Обзор] (/ review/low-quality-posts/11499101) – Rao

+3

@ Rao Ссылка указывает на модуль, который решает проблему, а не описание того, как решить проблему. Я не знаю, как еще переписать пост, может быть, у вас есть несколько советов? – user226114

+0

Этот модуль работает только с Django 1.4 до 1.8. – aboutaaron

Смежные вопросы