Celery调度(schedule):如何设置定时任务
Celery是一个常用的分布式任务队列,在开发中常用于执行异步任务和定时任务。Celery提供了一个灵活而强大的调度器,可以轻松地设置定时任务并定期执行。
一、Celery调度器的安装和配置
1. 首先,你需要安装Celery。你可以通过pip安装它:
pip install celery
2. 创建一个Celery实例,你可以在你的项目中的任何地方定义它:
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
这里我们创建了一个名为"tasks"的Celery实例,并指定了Redis作为消息代理。
3. 定义一个定时任务
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'task-name': {
'task': 'tasks.task_name',
'schedule': crontab(minute=0, hour=0), # 每天0点执行
},
}
这里我们使用了Celery的内置调度器,定义了一个"task-name"的定时任务,它将在每天的0点执行。你可以根据自己的需要设置定时周期,比如每小时执行一次、每分钟执行一次等。
4. 启动Celery调度器
在项目的根目录中运行以下命令启动Celery调度器:
celery -A your_project_name beat
这里需要将"your_project_name"替换为你的项目名称。
二、设置定时任务的使用例子
以下是一个简单的使用例子,假设我们有一个任务,需要每天在特定的时间执行。
1. 在你的任务文件中定义一个任务:
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email():
print('发送邮件')
这个任务的功能是发送邮件,当定时任务触发时会执行。
2. 在项目的根目录中创建一个启动文件:
from celery import Celery
from datetime import timedelta
from celery.schedules import crontab
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email():
print('发送邮件')
app.conf.beat_schedule = {
'send-email-task': {
'task': 'tasks.send_email',
'schedule': crontab(minute=0, hour=9), # 每天9点执行
},
}
这里我们将定时任务的定义和任务定义放在了同一个文件中,为了方便演示。实际开发中,你可能需要将它们分开放在不同的文件中。
3. 启动Celery调度器
在项目的根目录中运行以下命令启动Celery调度器:
celery -A main beat
这里的"main"是启动文件的名称,你可以根据实际情况进行修改。
4. 启动Celery Worker
在项目的根目录中运行以下命令启动Celery Worker:
celery -A main worker --loglevel=info
5. 执行定时任务
当定时任务触发时,你将会看到"Celery Worker"的控制台输出"发送邮件"的日志信息。
总结:
通过以上步骤,你就可以利用Celery设置定时任务并定期执行了。Celery的调度器非常灵活,可以根据你的需要设置不同的定时周期。它还支持其他调度器,比如固定间隔调度器(interval schedule)等,可以满足更多的需求。使用Celery的定时任务功能,可以帮助我们轻松地执行一些周期性的任务,提高开发效率。
