Celery,一个Python任务队列的快速库!

文摘   2024-11-25 21:44   河南  

开搞!今儿咱来聊聊 Celery,一个 Python 的任务队列,贼拉快!

Celery 这玩意儿,简单来说,就是帮你把一些耗时的任务扔到后台去跑,免得你的程序卡在那儿半天不动,用户体验贼差。想想看,上传个大文件,处理个复杂图片,这不得等半天?用 Celery,直接扔后台,前台该干嘛干嘛,舒服!

先整点简单的代码尝尝鲜。

from celery import Celery

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

@app.task

def add(x, y):

return x + y

这代码,看着挺吓人,其实不难。Celery('tasks', broker='redis://localhost:6379/0') 这行,就是创建了个 Celery 应用,tasks 是随便起的个名字,broker 是消息队列,咱这儿用 Redis。Redis 就像个邮局,Celery 把任务扔进去,Worker 从里面取出来执行。

@app.task 这玩意儿,叫装饰器,把 add 函数变成了一个 Celery 任务。以后想执行 add 函数,不用直接调用,而是扔给 Celery。

光有 Celery 应用还不够,得启动个 Worker 来干活。

celery -A tasks worker --loglevel=info

tasks 就是刚才咱起的名字。--loglevel=info 是设置日志级别,方便看 Worker 在干嘛。

现在,咱可以调用任务了:

from tasks import add

result = add.delay(2, 3)

print(result.get()) # 输出 5

注意,这儿不是直接调用 add(2, 3),而是 add.delay(2, 3)delay 就是把任务扔给 Celery 的意思。result.get() 就是获取结果。

这异步操作,就像叫外卖。你点了个外卖(add.delay(2, 3)),不用傻等,可以先干别的(前台继续运行)。等外卖到了(result.get()),再吃。

温馨提示:result.get() 会阻塞,直到任务执行完。要是你不想等,可以用 result.ready() 判断任务是否完成,或者用回调函数。

Redis 咱用得挺多,但还有其他选择,比如 RabbitMQ。这俩各有千秋,Redis 轻量级,RabbitMQ 功能更强大。看你的需求来选。

Celery 的任务有几种状态:PENDING(等待中)、STARTED(执行中)、SUCCESS(成功)、FAILURE(失败)、RETRY(重试)等等。可以通过 result.status 查看。

任务执行失败咋办?Celery 提供了重试机制。可以在 @app.task 里设置 retries 参数。

@app.task(retries=3)

def my_task():

# ...

这表示最多重试 3 次。

Celery 还可以执行定时任务,就像闹钟一样。

from celery.schedules import crontab

app.conf.beat_schedule = {

'add-every-minute': {

'task': 'tasks.add',

'schedule': crontab(), # 每分钟执行

'args': (16, 16)

},

}

这代码,每分钟执行一次 add(16, 16)crontab() 可以设置更复杂的定时规则。

温馨提示:定时任务需要启动 beat:celery beat -A tasks

今儿就先聊到这儿。Celery 这东西,功能贼多,咱慢慢学。先把这些基础的搞定,以后再整高级的。

翔宇风
精彩纷呈,引人入胜。
 最新文章