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

 

posted @ 2019-07-21 16:24  李孟达  阅读(2302)  评论(0编辑  收藏  举报