欢迎访问宙启技术站
智能推送

使用Celery.schedules调度定时任务并提高工作效率

发布时间:2023-12-27 08:19:32

Celery是一个用Python编写的分布式任务队列库,可以用于异步处理、定时任务调度等。Celery提供了Celery Beat,一个可以定时调度任务的子程序。Celery Beat使用Celery.schedules模块提供的时间表调度定时任务,并可以帮助我们提高工作效率。

下面我们将介绍如何使用Celery.schedules调度定时任务。

首先,我们需要安装Celery和Redis:

pip install celery
pip install redis

接下来,创建一个Celery实例,并配置Redis作为消息代理:

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')

然后,我们需要定义一个定时任务:

from datetime import timedelta

@app.task
def send_email():
    # 发送邮件的逻辑
    pass

在任务函数上方添加@app.task装饰器,表示这是一个Celery任务。

接下来,我们可以使用Celery.schedules模块中的时间表类来调度任务。Celery.schedules模块提供了多种定时任务调度方式,如crontab、solar、timedelta等。

例如,我们可以使用timedelta类来表示一个时间间隔,以便在一段时间后运行任务:

from celery.schedules import timedelta

app.conf.beat_schedule = {
    'send-email-every-30-seconds': {
        'task': 'send_email',
        'schedule': timedelta(seconds=30),
    },
}

这样配置之后,Celery Beat将会每隔30秒调度一次send_email任务。

除了使用时间间隔,我们还可以使用crontab类来按照cron表达式调度任务。例如,我们可以在每天的上午9点发送一封邮件:

from celery.schedules import crontab

app.conf.beat_schedule = {
    'send-email-every-morning': {
        'task': 'send_email',
        'schedule': crontab(hour=9, minute=0),
    },
}

这样配置之后,Celery Beat将会在每天的上午9点调度一次send_email任务。

可以在配置中添加多个定时任务,并指定不同的调度方式。例如,我们可以在每天上午9点和下午3点调度send_email任务:

from celery.schedules import crontab
from datetime import timedelta

app.conf.beat_schedule = {
    'send-email-every-morning': {
        'task': 'send_email',
        'schedule': crontab(hour=9, minute=0),
    },
    'send-email-every-afternoon': {
        'task': 'send_email',
        'schedule': crontab(hour=15, minute=0),
    },
    'send-email-every-30-seconds': {
        'task': 'send_email',
        'schedule': timedelta(seconds=30),
    },
}

这样配置之后,Celery Beat将会在每天的上午9点、下午3点和每隔30秒调度send_email任务。

最后,我们需要运行Celery Beat来启动定时任务调度功能:

celery -A tasks beat

这样,Celery Beat就会按照我们的配置调度定时任务了。

通过使用Celery.schedules模块,我们可以方便地调度定时任务,并提高工作效率。无论是按固定时间间隔还是按照cron表达式,都可以通过Celery Beat轻松实现定时任务调度。