Celery 定时任务教程
Celery 是一个强大的异步任务队列/作业队列基于分布式消息传递的开源项目。它广泛用于处理各种类型的后台任务,例如发送电子邮件、处理图像、数据分析和视频转换等。
本文将介绍如何使用 Celery 实现定时任务,包括:
- 安装 Celery
- 配置 Celery
- 定义定时任务
- 启动 Celery worker 和 beat
1. 安装 Celery
首先,您需要安装 Celery。可以通过以下命令进行安装:
bash
pip install celery
2. 配置 Celery
在django项目主文件夹下(即settings.py同目录)创建一个名为 celery.py
的文件,并添加以下代码:
python
import os
from django.conf import settings
from celery import Celery
from celery.schedules import crontab
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MainConfig.settings')
app = Celery('MainConfig')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
# 定时任务配置
app.conf.beat_schedule = {
'schedule_task': {
'task': 'myapp.tasks.add', # 任务代码所在文件
'schedule': crontab(hour='*/3'), # 每3小时执行一次
},
}
@app.task(bind=True, ignore_result=True)
def debug_task(self):
print(f'Request: {self.request!r}')
这里,我们使用 redis作为消息代理。
crontab示例
例子 | 意义 |
---|---|
crontab() |
每分钟执行一次。 |
crontab(minute=0, hour=0) |
每天午夜执行。 |
crontab(minute=0, hour='*/3') |
每三小时执行一次:午夜、凌晨 3 点、早上 6 点、早上 9 点、中午、下午 3 点、下午 6 点、晚上 9 点。 |
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 点至 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') |
每月第二天执行。 |
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') |
每年五月十一日执行。 |
crontab(0, 0, month_of_year='*/3') |
每季度第一个月每天执行。 |
settings.py相关配置
python
#从环境变量中读取服务网络
REDIS_SERVER_URL = os.environ.get('REDIS_SERVER_URL',"127.0.0.1")
# redis 配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": f"redis://{REDIS_SERVER_URL}:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# celery
CELERY_BROKER_URL = f"redis://{REDIS_SERVER_URL}:6379/0"
CELERY_RESULT_BACKEND = f"redis://{REDIS_SERVER_URL}:6379/0"
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
CELERY_TASK_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"
CELERY_ACCEPT_CONTENT = ["json"]
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_ENABLE_UTC = True
在django主项目目录的__init__文件下加入以下代码
python
from .celery import app as celery_app
__all__ = ('celery_app',)
3. 定义定时任务
在您的项目中创建一个名为 tasks.py
的文件,并添加以下代码:
python
from celery import shared_task
@shared_task
def add(x, y):
return x + y
这里,我们定义了一个名为 add
的任务,它接受两个参数 x
和 y
并返回它们的和。
5. 启动 Celery worker 和 beat
使用以下命令启动 Celery worker 和 beat:
bash
celery -A MainConfig worker -l info -P threads
celery -A main beat --loglevel=info
这里,-A
指定当前目录作为工作目录,--loglevel=info
设置日志级别为 info
。
总结
使用 Celery 实现定时任务非常简单。只需按照上述步骤进行配置,即可轻松实现各种复杂的定时任务。