Джанго Фоновое задание - PullRequest
17 голосов
/ 07 июля 2011

Мне нужно заполнять базу данных SQLite каждые несколько минут в Django, но я хочу обслуживать устаревшие данные, пока данные не будут доступны для обновления базы данных.(т. е. я не хочу блокировать данные, которые нужно собрать; only время, которое я могу заблокировать, это при блокировке базы данных, в течение которой у меня нет выбора.)

Я также не хочу устанавливать отдельную программу или библиотеку.

Как мне настроить другой поток, который мог бы вызывать save() на нескольких моделях, не сталкиваясь с проблемами потоков?

Ответы [ 6 ]

18 голосов
/ 11 февраля 2012

Если вы ищете легкое решение для простого выполнения чего-либо в фоновом режиме, а не полноценную систему управления задачами, взгляните на django-utils . Среди прочего, он включает в себя декоратор функций @ async , который заставит функцию выполняться асинхронно в отдельном потоке.

Используйте это так:

from djutils.decorators import async

@async
def load_data_async():
    # this will be executed in a separate thread
    load_data()

Затем вы можете вызвать либо load_data_async function для фона, либо обычную load_data функцию для блокировки выполнения.

Обязательно установите версию до 2.0, так как в ней отсутствует декоратор @async.

Примечание: Если даже установка django-utils будет слишком большой, вы можете просто загрузить ее и включить несколько необходимых файлов в ваш проект.

16 голосов
/ 07 июля 2011

Celery .

Celery - это асинхронная очередь / очередь заданий, основанная на распределенной передаче сообщений.Он ориентирован на работу в реальном времени, но также поддерживает планирование.

Celery написан на Python, но протокол может быть реализован на любом языке.Он также может работать с другими языками, используя webhooks.

6 голосов
/ 09 декабря 2015

Просто быстрое обновление ответа Джона Лемана: django-background-task не поддерживается и несовместим с более новой версией Django.Некоторое время назад мы обновили и расширили его новыми функциями и поддерживаем новый обратно совместимый пакет на Github .Новое приложение django-background-tasks можно загрузить или установить из PyPI.

5 голосов
/ 07 июля 2011

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

* 1006.* Если вам нужно, чтобы это выглядело атомарно, упаковка всех записей в одну транзакцию SQLite через django.db.transaction , вероятно, должна предоставить вам необходимые блокировки.
4 голосов
/ 17 декабря 2014

Фоновая задача Django - рабочая очередь на основе данных для Django, свободно основанная на библиотеке Ruby DelayedJob.

Вы украшаете функции для создания задач:

@background(schedule=60)
def notify_user(user_id):
    # lookup user by id and send them a message
    user = User.objects.get(pk=user_id)
    user.email_user('Here is a notification', 'You have been notified')

Хотя вам все еще нужно что-то, что планирует эти задачи. Некоторые преимущества включают автоматические повторные попытки для невыполненных задач и настройку максимальной продолжительности для запущенной задачи.

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

1 голос
/ 12 сентября 2015

У меня была такая же проблема, но я не хотел запускать службу типа сельдерея, чтобы решить эту проблему.

Я обнаружил posix_spawn в системах Linux. Вы можете написать команды manage.py, которые запускаются в вашей полной среде django. Эти команды могут быть выполнены в фоновом режиме с этим проектом.

Если вам нужно передать данные обратно на сайт во время выполнения, я использую memcached.

https://github.com/lukedupin/django_posix_spawn

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