Если вам нужно настроить временные задачи или позволить пользователям вручную устанавливать временные задачи на странице при разработке веб-проекта с использованием платформы Django, эта статья может вам помочь.
Обзор
Существует примерно три способа реализации функции запланированной задачи в Django:
Сельдерей Фреймворк
Запланированная задача — это особый тип распределенной задачи. Распространение Django в основном реализуется фреймворком Celery, который представляет собой распределенную очередь задач, разработанную Python. Поскольку он не поддерживает саму службу хранения сообщений, для доставки задач требуется сторонняя служба сообщений, обычно использующая Redis.
преимущество:
- Celery фокусируется на операциях в реальном времени, может использоваться в производственных системах, которые обрабатывают миллионы задач в день, и может использоваться для крупных проектов.
- Планирование задач может выполняться на распределенных машинах, процессах и потоках.
недостаток:
Настройка и использование более сложны, для них требуется база данных Redis и несколько сторонних библиотек Python.
django-crontab
Просто загрузите пакет django-crontab, чтобы настроить запланированные задачи в среде Django с помощью выражений cron. Я мало что знаю об этом методе, но кажется, что этот метод не поддерживает систему Windows, и функция относительно проста.
django-apscheduler
Простая конфигурация, полный набор функций, гибкое использование, поддержка Windows и Linux, подходит для небольших и средних проектов.
инструкции
Связанные концепции в django-apscheduler такие же, как и в apscheduler структуры временных задач Python.Заинтересованные студенты могут обратиться к ним самостоятельно.
(В этой статье используется архитектура django + mysql)
Установите модуль
pip install django-apscheduler
настроить
- Сначала настройте информацию о базе данных в settings.py (опущено).
- существуетINSTALLED_APPSПрисоединяйсяdjango-apschedulerприменение:
INSTALLED_APPS = [
...
'django_apscheduler',
...
]
выполнить миграцию
python manage.py migrate
Взгляните на базу данных и сгенерируйте две таблицы, большинство из которых соответствует названию.
1. django_apscheduler_djangojob
Таблица для хранения задач
job_state: я предполагаю, что он существует здесь после сериализации конкретного кода выполнения и параметров задачи.2. django_apscheduler_djangojobexecution
Таблица для хранения статуса выполнения задачи
продолжительность: как долго выполнять
исключение: есть ли исключение
использовать
Создать задачу
Существует примерно два способа создания задач: декораторы и функция add_job.
1. Декоратор
в любойview.pyКод реализации в (я привык открывать новое приложение для реализации задач по времени):
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
# 实例化调度器
scheduler = BackgroundScheduler()
# 调度器使用默认的DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 每天8点半执行这个任务
@register_job(scheduler, 'cron', id='test', hour=8, minute=30,args=['test'])
def test(s):
# 具体要执行的代码
pass
# 注册定时任务并开始
register_events(scheduler)
scheduler.start()
запустить службуpython manage.py runserver
Задача будет храниться вdjango_apscheduler_djangojobтаблицу и выполнить программу в соответствии с установленным временем.
параметр
- планировщик: указать планировщик
- триггер: есть три способа выполнить задачу: «дата», «интервал», «cron».
- Комбинация параметров «date» + «run_date» может быть достигнутаодиночная задача.
Пример: 2019-07-07 22:49:00 выполнить задачу
@register_job(scheduler, 'date', id='test', run_date='2019-07-07 22:49:00')
Примечание: Во время pro теста после выполнения задачи будет выдано сообщение об ошибке, причина в том, что после выполнения задачи задача в таблице djangojob будет удалена в mysql. Однако таблица djangojobexecution записывает результаты выполнения, и с таблицей djangojob связан внешний ключ, поэтому при удалении отображается ошибка ограничения внешнего ключа. Тем не менее, задача будет выполнена в обычном режиме и после выполнения будет удалена в обычном режиме. - Комбинация параметров «интервал» + «часы» + «минуты» + ..... может достичьинтервальная задача.
Пример: выполнять задачу каждые 3 с половиной часа.
@register_job(scheduler, 'interval', id='test', hours=3, minutes=30)
Также есть параметры секунд и дней на выбор
Примечание. Если задачу нужно выполнять в течение 10 секунд, а интервал установлен на 1 секунду, это не даст вам 10 потоков для выполнения 10 задач одновременно. Он будет пропускать другие задачи, пока текущая задача не будет завершена. - Комбинация параметров «cron» + «час» + «минута» +... может быть достигнутазадачи класса cron.
Пример: выполнение задачи в 8:30 каждый день.
@register_job(scheduler, 'cron', id='test', hour=8, minute=30)
Есть также такие параметры, как день, секунда и месяц на выбор.
- Комбинация параметров «date» + «run_date» может быть достигнутаодиночная задача.
- id: Название задачи, если не пройдено, то будет сгенерировано автоматически. Однако для того, чтобы впоследствии приостановить, открыть, удалить и другие операции над задачей, рекомендуется дать имя. И это уникально.Если несколько задач берут имя, предыдущая задача будет перезаписана.
- аргументы: тип списка. Параметры, необходимые для выполнения кода.
- next_run_time: тип даты и времени. Время начала выполнения. Если вы создаете запланированную задачу сейчас и хотите автоматически отправлять WeChat своей девушке в 3:30 утра через 3 дня, вам нужен этот параметр.
Учащиеся, интересующиеся другими параметрами, могут просмотреть исходный код, чтобы понять.
2. функция add_job
Метод декоратора подходит для людей, которые пишут код для самостоятельного создания задач.Если вы хотите, чтобы пользователи вводили параметры через страницу и отправляли их для ручного создания задач по времени, вам нужно использовать функцию add_job.
В следующем небольшом примере интерфейс передает данные json на сервер и запускает функцию test_add_task для добавления задач:
import json
from django.http import JsonResponse
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 与前端的接口
def test_add_task(request):
if request.method == 'POST':
content = json.loads(request.body.decode()) # 接收参数
try:
start_time = content['start_time'] # 用户输入的任务开始时间, '10:00:00'
start_time = start_time.split(':')
hour = int(start_time)[0]
minute = int(start_time)[1]
second = int(start_time)[2]
s = content['s'] # 接收执行任务的各种参数
# 创建任务
scheduler.add_job(test, 'cron', hour=hour, minute=minute, second=second, args=[s])
code = '200'
message = 'success'
except Exception as e:
code = '400'
message = e
back = {
'code': code,
'message': message
}
return JsonResponse(json.dumps(data, ensure_ascii=False), safe=False)
# 具体要执行的代码
def test(s):
pass
register_events(scheduler)
scheduler.start()
Таким образом, внешний пользователь может вручную установить запланированную задачу.
параметр
Аналогичен параметрам декоратора, но первый параметр отличается.
Если конкретная функция, которая должна быть выполнена, и функция, которая ее вызывает, находятся в файле, то необходимо передать только имя функции (как в приведенном выше примере).
Но я привык записывать конкретный бизнес-код в другой файл.В view.py пишутся только интерфейсные функции фронтенда и бэкенда взаимодействий.В данном случае передается параметр-строка в формате: 'package.module:some.object', имя пакета. Module: имя функции
Другие функции
Фреймворк django-apscheduler также предоставляет множество функций для управления временными задачами. Например:
- удалить задачу
scheduler.remove_job(job_name)
- Приостановить задачу
scheduler.pause_job(job_name)
- открытая задача
scheduler.resume_job(job_name)
- Изменить задачи
scheduler.modify_job(job_name)
Примечание: Изменение задач может изменить только параметры.Если вы хотите изменить время выполнения, удалите задачу и создайте ее снова.
Вы можете сделать такую таблицу на странице, и с помощью простых взаимодействий с интерфейсом и сервером пользователи могут самостоятельно управлять задачами по времени:
Есть и другие вспомогательные функции (в том числе отображение всех заданий, отображение времени выполнения заданий и т. д.), которые учащиеся могут просматривать самостоятельно.
Наконец, спасибо за чтение.