提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
在使用python的Django框架时,可以使用celery工具来定性定时任务的创建。可以帮助我们实现很多计划性任务。 某些情况下,我们会想要需要根据我们的函数传参实现动态生成定时任务,这是我们就可以使用第三方库django-celery-beat、django-celery-results来实现。示例以来Python的Django框架。
提示:以下是本篇文章正文内容,下面案例可供参考
一、定时任务原理
在我们使用django-celery-beat创建任务时,在启用celery-worker时(python manage.py celery worker -l info) 会在我们的数据库中生成记录信息。记录任务的时间与函数方法。 例如: 在创建任务完成后,celery会遍历数据表内容,django_celery_beat_periodictask记录创建的任务信息,django_celery_beat_crontabschedule、django_celery_beat_intervalschedule记录任务时间维度。
二、使用步骤
1.安装库
初始化框架时,将celery信息存入requirements.txt
Django==2.2.6
celery==4.4.0
django-celery-beat==2.0.0
django-celery-results==1.2.1
运行 pip install -r requirements.txt 进行数据库迁移 python manage.py migrate
2.创建任务
代码如下(示例):
import logging
from celery.task import periodic_task
from celery.schedules import crontab
from django_celery_beat.models import PeriodicTask,IntervalSchedule,CrontabSchedule
logger = logging.getLogger('root')
@periodic_task(run_every=crontab(minute='0', hour='0'))
def operation_strategy_bkjob():
work_time = [["04:00:00","04:00:00"],["20:00:00","20:00:00"],["11:10:00","16:00:00"]]
for time_ in work_time:
enter_time = time_[0]
enter_time_hour = int(enter_time.split('-')[0])
enter_time_minute = int(enter_time.split('-')[1])
end_time = time_[-1]
end_time_hour = int(end_time.split('-')[0])
end_time_minute = int(end_time.split('-')[-1])
bool_enter_task,enter_task_name = enter_task(enter_time_hour,enter_time_minute,task_info='homen_application.views.operation_task',strategy_id=strategy_id,enabled=True,strategy_name=strategy_object.name)
if bool_enter_task == False:
logger.error("<创建任务失败>[}".format(enter_task_name))
bool_stop_task,stop_task_name = enter_task(end_time_hour,end_time_minute,task_info='homen_application.views.operation_task',strategy_id=strategy_id,enabled=False,strategy_name=strategy_object.name)
if bool_stop_task == False:
logger.error("<停止任务失败>[}".format(stop_task_name))
logger.info('<---{}:创建作业平台当天定时任务完成--->'.format(today_str))
def enter_task(hour_,minute_,task_info,strategy_id,strategy_name, enabled,**kwargs):
"""创建定时任务"""
try:
task_name= strategy_name + "-" + hour_ + "-" + minute_
crontab, _ = CrontabSchedule.objects.update_or_create(
minute=minute_,
hour=hour_,
day_of_week="*",
day_of_month='*',
month_of_year='*',
)
PeriodicTask.objects.update_or_create(
defaults={
"crontab": crontab,
"task": task_info,
"kwargs": json.dumps({"strategy_id":strategy_id, "enabled":enabled}, ensure_ascii=False)
},
name=task_name,
)
return True,task_name
except Exception as e:
logger.error('<---创建定时任务失败--->{}'.format(e))
return False,str(e)
该代码片段可实现在每天00:00:00进行任务创建,任务执行时间有参数work_time控制,任务使用方法的参数由 enter_task 中args与kwargs控制。
3.停止、删除任务操作
def stop_task(hour_,minute_,task_info,is_delete,**kwargs):
"""终止定时任务"""
try:
tasks = PeriodicTask.objects.filter(name=task_info)
if tasks:
tasks.update(enabled=False)
if is_delete:
tasks.delete()
return True,'success'
except Exception as e:
return False,str(e)
总结
以上为对第三方库django-celery-beat2.0.0 django-celery-results1.2.1的一个简单实用记录。
|