Celery.schedules.schedule()方法详解及使用案例
Celery是一个常用的分布式任务队列框架,用于实现异步任务处理。在Celery中,可以通过schedule()方法设置定时任务的执行时间,这样可以实现定时执行一些任务。
schedule()方法接受一个字典作为参数,可以设置多个任务的执行时间。字典的键为任务的名称,值为一个字典,包含任务的执行时间和其他可选参数。
以下是一个使用schedule()方法设置定时任务的示例代码:
from celery import Celery
from datetime import timedelta
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(
timedelta(seconds=10),
test.s('Hello, World!'),
name='add every 10 seconds'
)
sender.add_periodic_task(
timedelta(minutes=1),
test.s('Hello, World!'),
expires=10
)
@app.task
def test(arg):
print(arg)
在上述代码中,首先创建了一个Celery实例,并设置了消息代理的地址。然后定义了一个名为test的任务,该任务只是简单地打印参数。
接着,在on_after_configure事件回调中,使用add_periodic_task()方法设置了两个定时任务。第一个任务每隔10秒执行一次,传递的参数为'Hello, World!';第二个任务每隔1分钟执行一次,并设置了一个过期时间为10秒。
通过以上的设置,每隔10秒和1分钟,都会执行test任务,输出'Hello, World!'。
除了上述示例中的设置方式,schedule()方法还可以使用一些特殊的时间表达式来设置任务的执行时间。下面是一些常用的时间表达式:
- crontab(minute='*', hour='*', day_of_week='*', day_of_month='*', month_of_year='*'):使用CRON表达式设置任务的执行时间。每个参数都可以使用区间、逗号分隔、星号(*)等形式来设置具体的值。
- timedelta(seconds=60):使用timedelta对象设置任务的执行时间间隔。这个参数可以设置为一个整数或者一个timedelta对象。
- crontab()和timedelta()可以结合使用,来设置更复杂的任务执行时间。
下面是一个使用CRON表达式和timedelta对象的示例代码:
from celery import Celery
from celery.schedules import crontab
from datetime import timedelta
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(
crontab(hour=9, minute=30, day_of_week='1-5'),
test.s('Good morning!'),
name='run every weekday morning'
)
sender.add_periodic_task(
timedelta(days=30),
test.s('Happy new month!'),
name='run every month'
)
@app.task
def test(arg):
print(arg)
在这个示例代码中,设置了两个定时任务。第一个任务设置了每周一至周五的早上9点30分执行,第二个任务设置了每月执行一次。
通过使用Celery的schedule()方法,可以方便地设置定时任务,实现异步任务的定时执行。上述示例代码演示了不同的时间设置方式,供开发者参考使用。
