测试环境:
ubuntu:20.04
python:3.6
django:2.2
celery:4.4.7
创建django项目
添加celery的配置文件,目录结构如下图
修改配置文件
这里我使用redis作为消息中间件,任务的信息和结果返回都存储在redis中。
/proj/settings.py文件
CELERY_BROKER_URL = 'redis://localhost:6379/0' # 工人信息,以及任务信息
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1' # 任务结果存储
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIME_ZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True
/proj/celery.py文件
import os
from celery import Celery
# 获取celery在settings中的配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
# celery实例对象创建
app = Celery('proj')
# 使用配置信息,其中namespace作用为所有的celery配置都需要使用CELERY作为前缀,且最好所有字母都大写
app.config_from_object('django.conf:settings', namespace='CELERY')
# 获取所有的task,官方文档中说可以自动获取所有的task,但是我测试时需要加上task否则他会显示为注册类型
app.autodiscover_tasks(['demoapp.tasks.mul'])
# 下面的设置就是关于调度器beat的设置
app.conf.beat_schedule = {
'test': { # 取个名字
'task': 'demoapp.tasks.mul', # 设置是要将哪个任务进行定时
'schedule': crontab(hour=23, minute=59, day_of_week=[0,1,2,3,4,5,6]), # 调用crontab进行具体时间的定义.如果想以秒为单位做定时可以'schedule': 10表示每10秒运行该任务
'args':(2,3) # 参数
}
}
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
测试代码
/demoapp/task.py
from celery import shared_task
@shared_task
def mul(x, y):
return x * y
运行命令
在项目目录下运行此命令
celery -A proj worker -B -l info
其中-A表示创建的celery对象,-B表示启动定时,-l info日志输出等级是info

参考官方文档
定时任务crontab用法
| Example | Meaning |
|---|---|
| crontab() | 每分钟执行. |
| crontab(minute=0, hour=0) | 每个凌晨执行. |
| crontab(minute=0, hour=’*/3’) | 每天的3、6、9、12、15、18、21、1、24点执行 |
| crontab(minute=0,hour=‘0,3,6,9,12,15,18,21’) | 同上. |
| crontab(minute=’*/15’) | 每15分钟执行一次. |
| crontab(day_of_week=‘sunday’) | 在周末没分钟执行一次. |
| crontab(minute=’’,hour=’’, day_of_week=‘sun’) | 同上. |
| crontab(minute=’*/10’,hour=‘3,17,22’, day_of_week=‘thu,fri’) | 在星期四和星期五的3、17、22点每10分钟执行一次. |
| crontab(minute=0, hour=’/2,/3’) | 每天的1am, 5am, 7am, 11am, 1pm, 5pm, 7pm, 11pm执行 |
| crontab(minute=0, hour=’*/5’) | 每天5、10、15、20点执行 |
| crontab(minute=0, hour=’*/3,8-17’) | 每天9、12、15点执行 |
| crontab(0, 0, day_of_month=‘2’) | 每个月的第二天执行. |
| crontab(0, 0,day_of_month=‘2-30/2’) | 偶数日执行. |
| crontab(0, 0,day_of_month=‘1-7,15-21’) | 每个月的第一周和第三周执行 |
| crontab(0, 0, day_of_month=‘11’,month_of_year=‘5’) | 每年的11月5日执行. |
| crontab(0, 0,month_of_year=’*/3’) | 3、6、9、12月执行. |
版权声明:本文为qq_39248122原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。