Celery+RabbitMQ快速入门
# Celery+RabbitMQ快速入门
Celery和RabbitMQ的协作方式案例:
假设A公司最近在开下年度工作会议,会议上要确定下一年的工作内容和计划,参会人员有老板(下发任务者)、部门主管(Celery分配任务者)、部门员工(工作者)、老板秘书(沟通协调者RabbitMQ)。
那么这场会议首先需要确定的是下一年的具体工作内容,这里就称之为“任务内容”。比如老板说我们下一年要开发出一款社交类APP产品,部门主管表示赞同,于是便愉快地定下了具体的工作任务(task),当然开发一款社交类APP产品是这个项目的总任务,其中可以细分成很多小的任务,比如业务流程是怎么样的?界面怎么设计等。
在确定了具体工作任务后,老板便把这个项目交给了部门主管(Celery),部门主管确定部门员工中谁去完成这项任务,于是指定某个人(Worker),也可以多个人。
发布工作任务的人是老板(下发任务者),他指定了部门主管(Celery)什么时候去完成哪些任务,并要求获取反馈信息。但有一点需要注意,老板只管布置任务,不参与具体的任务分配,这个任务分配的工作是交给部门主管(Celery)去执行。
项目之初,老板(下发任务者)通过公司会议将任务传递给部门主管(Celery),部门主管通过部门会议将任务分配给员工(Worker),过段时间再将任务结果反馈给老板。然而随着任务越来越多,部门主管发现任务太多,每个任务都要反馈结果,记不住,也容易弄乱,导致效率下降。
在召开会议商量了一番后,老板秘书(沟通协调者RabbitMQ)站起来说:“我有个提议,老板每天将布置的任务写成一张纸条放到我这,然后部门主管每天早上来取并交给员工,至于纸条上的任务如何分配,部门主管决定就行,但是要将结果同样写一张纸条反馈给我,我再交给老板。这样老板只负责下发任务,我只负责保管任务纸条,部门主管只负责分配任务并获取反馈,员工只负责按任务工作。大家职责都很明确,效率肯定会更高。”至此,老板与员工的沟通问题也解决了。

Celery介绍和基本使用
Celery是一个基于Python开发的分布式异步消息任务队列,它简单、灵活、可靠,是一个专注于实时处理的任务队列,同时也支持任务调度。通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用Celery。
举几个适用场景:
1)可以在 Request-Response 循环之外执行的操作:发送邮件、推送消息。
2)耗时的操作:调用第三方 API、视频处理(前端通过 AJAX 展示进度和结果)。
3)周期性任务:取代 crontab。
Celery有以下几个优点:
- 简单:一旦熟悉了Celery的工作流程后,配置和使用是比较简单的。
- 高可用:当任务执行失败或执行过程中发生连接中断,Celery 会自动尝试重新执行任务。
- 快速:一个单进程的Celery每分钟可处理上百万个任务。
- 灵活: Celery的大部分组件都可以被扩展及自定制。
选择Broker
Celery的基本架构和工作流程:

常用的Broker有RabbitMQ、Redis、数据库等,我们这里使用的是RabbitMQ:

创建Application和Task
Celery的默认broker是RabbitMQ,仅需配置一行就可以:
创建一个Celery Application用来定义任务列表。
实例化一个Celery对象app,然后通过@app.task 装饰器注册一个 task。任务文件就叫tasks.py:
运行 worker开始监听执行任务
在 tasks.py 文件所在目录运行
这个命令会开启一个在前台运行的 worker,解释这个命令的意义:
worker: 运行 worker 模块。
-A: –app=APP, 指定使用的 Celery 实例。
-l: –loglevel=INFO, 指定日志级别,可选:DEBUG, INFO, WARNING, ERROR, CRITICAL, FATAL
其它常用的选项:
-P: –pool=prefork, 并发模型,可选:prefork (默认,multiprocessing), eventlet, gevent, threads.
-c: –concurrency=10, 并发级别,prefork 模型下就是子进程数量,默认等于 CPU 核心数
完整的命令行选项可以这样查看:
$ celery worker --help
调用Task
再打开一个终端, 进行命令行模式,调用任务.
上面两种调用方式等价,delay() 方法是 apply_async() 方法的简写。这个调用会把 add 操作放入到队列里,然后立即返回一个 AsyncResult 对象。如果关心处理结果,需要给 app 配置 CELERY_RESULT_BACKEND,指定一个存储后端保存任务的返回值。
在项目中的简单使用流程
1)RabbitMQ所在服务器,启动crontab设置 crontable -user user -e设置定时执行celery application应用。
python tasks.py day
2)在task.py文件里面启动一个叫做app的Celery Application,编写一个app.task函数来produce 任务到rabbitmq。
app = Celery()
app.config_from_object(celeryconfig)
3)在每个worker里面通过命令启动worker消费任务
$ celery worker -A tasks.app -l INFO
RabbitMQ
RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。AMQP即Advanced Message Queue,高级消息队列协议。为面向消息
的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
__EOF__

本文链接:https://www.cnblogs.com/starkzz/p/16463784.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现