定时任务: 不需要依赖项目启动
1. tasks.py 创建异步任务
from celery import shared_task
# 异步任务
@shared_task
def sum_even(data):
return data
# 获取异步任务的结果
from celery.signals import task_success
@task_success.connect(sender=sum_even) # sender=函数: 谁发送的信号
def complete(sender=None, result=None, **kwargs): # 函数固定写法
print(result) # result 获取异步任务执行的结果
2. settings.py配置定时任务
两种方式:
(1). 定时任务
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'schedule-test': {
'task': 'App02.tasks.hello_world', # app的名字.tasks.函数名
'schedule': timedelta(seconds=10), # 每隔多久执行一次: 秒
'args': ('hello world',) # 函数的参数在这个里面传
}
}
(2). 计划任务时间
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
'every-ten-second-run-my_task': {
'task': 'app01.tasks.sum_even', # app的名字.tasks.函数名
'schedule': crontab(minute="27", hour="17"), # 每天17点27分执行一次
'args': ('hello world',) # 函数的参数在这个里面传,没有参数的话注释掉
}
}
3. 启动
'''
我们启动定时任务服务时 也要先开启worker
如果只开启定时服务没有开启worker服务 那么定时任务会被放入任务队列,
但是由于没有干活儿的worker 那么任务是不会被执行,
当worker服务被启动后会立刻去任务队列领任务并执行
你的任务一定要确保是可以正常执行的
'''
# 启动worker
celery -A 主应用名(django912) worker -l info --pool=solo
# 启动定时任务
celery -A 主应用名 beat -l info
4. crontab 执行时间表
Example | Meaning |
crontab() | 执行每一分钟。 |
crontab(minute=0, hour=0) | 每天午夜0:00执行。 |
crontab(minute=0, hour='*/3') | 每三个小时执行一次:午夜,凌晨3点,早上6点,早上9点,中午,下午3点,下午6点,晚上9点。 |
| 和?的一样. |
crontab(minute='*/15') | 每15分钟执行一次。 |
crontab(day_of_week='sunday') | 星期日每分钟执行一次。 |
| 和?的一样. |
| 每十分钟执行一次,但仅在周四或周五的凌晨3-4点,下午5-6点和晚上10点至11点之间执行。 |
crontab(minute=0,hour='*/2,*/3') | 每隔一小时执行一次,每小时一次可以整除三次。 这意味着:每小时除外:凌晨1点,凌晨5点,早上7点,上午11点,下午1点,下午5点,晚上7点,晚上11点 |
crontab(minute=0, hour='*/5') | 执行小时可被5整除。这意味着它在下午3点触发,而不是在下午5点触发(因为下午3点等于24小时时钟值“15”,可以被5整除)。 |
crontab(minute=0, hour='*/3,8-17') | 每小时可被3整除,并在办公时间(上午8点至下午5点)每小时执行一次。 |
crontab(0, 0,day_of_month='2') | 每月第二日执行。 |
| 每偶数天执行一次。 |
| 在每月的第一周和第三周执行。 |
| 每年5月11日执行。 |
| 在每个季度的第一个月每天执行。 |