Celery定时任务|计划任务
适用场景几点几分执行特定的任务
定时任务
配置这个无需多说了和上篇文章一样
任务函数
硬菜来了 添加任务时候的写法
第一种:
from celery_task.order_task import order_add from celery_task.user_task import user_add from datetime import datetime # 拼接得到执行任务的时间,得到的就是一个时间对象 v1 = datetime(2019, 7, 21, 16, 53, 00) print('执行任务时间:', v1) # 转化成utc时间 v2 = datetime.utcfromtimestamp(v1.timestamp()) print('执行任务的utc时间:', v2) # 执行定时任务,调用apply_async,args是要传入的参数,eta是执行的时间 result = user_add.apply_async(args=[1, 3], eta=v2) print(result.id)
这里面需要把时间转化成utc时区的时间,不然间隔十小时,自己推算即可
唯一变的就是传递参数的调用变成了apply_async(args=[参数,参数],eta=执行任务的时间)
worker日志
接收到任务到时间 16:52:17
任务执行完成的时间 16:53:02
任务耗时2秒
第二种
# 获取当前时间 ctime = datetime.now() # 默认用utc时间,把当前时间转utc时间 utc_ctime = datetime.utcfromtimestamp(ctime.timestamp()) from datetime import timedelta # 这段意思是取十秒之后的时间对象,因为时间对象只能和时间对象相加 time_delay = timedelta(seconds=10) # 最终的时间对象为当前时间后十秒 task_time = utc_ctime + time_delay print('最终时间', task_time) # 使用apply_async并设定时间 result = user_add.apply_async(args=[4, 3], eta=task_time) print(result.id)
打印信息
worker日志信息
执行计划任务
from datetime import timedelta from celery.schedules import crontab APP.conf.beat_schedule = { # 名字随意命名 'add-every-10-seconds': { # 执行tasks1下的test_celery函数 'task': 'celery_task.tasks1.test_celery', # 每隔2秒执行一次 # 'schedule': 1.0, # 'schedule': crontab(minute="*/1"), 'schedule': timedelta(seconds=2), # 传递参数 'args': ('参数', '参数') }, 'add-every-12-seconds': { 'task': 'celery_task.tasks1.test_celery', # 每年4月11号,8点42分执行 'schedule': crontab(minute=42, hour=8, day_of_month=11, month_of_year=4), 'schedule': crontab(minute=42, hour=8, day_of_month=11, month_of_year=4), 'args': (16, 16) }, }
启动一个beat自定提交任务:celery beat -A celery_tasks.tasks -l info
宁可清贫自乐,不可浊富多忧