开搞!今儿咱来聊聊 Celery,一个 Python 的任务队列,贼拉快!
Celery 这玩意儿,简单来说,就是帮你把一些耗时的任务扔到后台去跑,免得你的程序卡在那儿半天不动,用户体验贼差。想想看,上传个大文件,处理个复杂图片,这不得等半天?用 Celery,直接扔后台,前台该干嘛干嘛,舒服!
先整点简单的代码尝尝鲜。
这代码,看着挺吓人,其实不难。Celery('tasks', broker='redis://localhost:6379/0')
这行,就是创建了个 Celery 应用,tasks
是随便起的个名字,broker
是消息队列,咱这儿用 Redis。Redis 就像个邮局,Celery 把任务扔进去,Worker 从里面取出来执行。
@app.task
这玩意儿,叫装饰器,把 add
函数变成了一个 Celery 任务。以后想执行 add
函数,不用直接调用,而是扔给 Celery。
光有 Celery 应用还不够,得启动个 Worker 来干活。
tasks
就是刚才咱起的名字。--loglevel=info
是设置日志级别,方便看 Worker 在干嘛。
现在,咱可以调用任务了:
注意,这儿不是直接调用 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
参数。
这表示最多重试 3 次。
Celery 还可以执行定时任务,就像闹钟一样。
这代码,每分钟执行一次 add(16, 16)
。crontab()
可以设置更复杂的定时规则。
温馨提示:定时任务需要启动 beat:celery beat -A tasks
。
今儿就先聊到这儿。Celery 这东西,功能贼多,咱慢慢学。先把这些基础的搞定,以后再整高级的。