本文目录一览:
Celery 简介
任务队列是一种把任务通过线程或机器进行分发的机制,输入是一个工作单元--任务,工作进程则不断地检查任务队列来执行新任务。
celery使用消息来通信,通常需要中间件中转。流程为:客户端添加消息到队列来初始化一个任务,然后消息队列系统把消息分发给工作进程。
celery可以包含多个工作进程和消息队列系统,来保证高可用性和进行水平扩展。
虽然celery是python实现的,仍可轻松实现其他语言的客户端,如php js,或可可使用webhooks来交互。
可在单台机器、多台机器、集群中运行
需要py2.7+ 不支持win
需要rabbitmq或redis作为消息中间件
不需要配置文件
工作进程和客户端在连接丢失或失败时会自动重试,一些支持HA的消息系统可以做主主、主从扩展
每分钟处理几百万任务,通过使用RabbitMQ librabbitmq 和 一些优化设置,可使得rtt为亚毫秒级
它的每一部分都可以灵活地扩展(自定义的pool,序列化方式,压缩,日志,定时任务,消费者,生产者,中间件)
redis rabbitmq
redis amqp memcached orm apache-Cassandra ES
fork eventlet gevent 单线程
pickle json yaml 另支持压缩 签名 加密
celery python 好用吗
为什么要使用celery
Celery是一个使用Python开发的分布式任务调度模块,因此对于大量使用Python构建的系统,可以说是无缝衔接,使用起来很方便。Celery专注于实时处理任务,同时也支持任务的定时调度。因此适合实时异步任务定时任务等调度场景。Celery需要依靠RabbitMQ等作为消息代理,同时也支持Redis甚至是Mysql,Mongo等,当然,官方默认推荐的是RabbitMQ。
broker的选择
虽然官方支持的broker有很多,包括RabbitMQ,Redis甚至是数据库,但是不推荐使用数据库,因为数据库需要不断访问磁盘,当你的任务量大了之后会造成很严重的性能问题,同时你的应用很可能也在使用同一个数据库,这样可能导致你的应用被拖垮。如果业务环境比较简单可以选择Redis,如果比较复杂选择RabbitMQ,因为RabbitMQ是官方推荐的,但是比Redis操作起来又相对复杂些。我的选择是broker用RabbitMQ,backend用Redis
希望能帮到你!
Python 异步任务队列Celery 使用
在 Python 中定义 Celery 的时候,我们要引入 Broker,中文翻译过来就是“中间人”的意思。在工头(生产者)提出任务的时候,把所有的任务放到 Broker 里面,在 Broker 的另外一头,一群码农(消费者)等着取出一个个任务准备着手做。这种模式注定了整个系统会是个开环系统,工头对于码农们把任务做的怎样是不知情的。所以我们要引入 Backend 来保存每次任务的结果。这个 Backend 也是存储任务的信息用的,只不过这里存的是那些任务的返回结果。我们可以选择只让错误执行的任务返回结果到 Backend,这样我们取回结果,便可以知道有多少任务执行失败了。
其实现架构如下图所示:
可以看到,Celery 主要包含以下几个模块:
celery可以通过pip自动安装。
broker 可选择使用RabbitMQ/redis,backend可选择使用RabbitMQ/redis/MongoDB。RabbitMQ/redis/mongoDB的安装请参考对应的官方文档。
------------------------------rabbitmq相关----------------------------------------------------------
官网安装方法:
启动管理插件:sbin/rabbitmq-plugins enable rabbitmq_management 启动rabbitmq:sbin/rabbitmq-server -detached
rabbitmq已经启动,可以打开页面来看看 地址:
用户名密码都是guest 。进入可以看到具体页面。 关于rabbitmq的配置,网上很多 自己去搜以下就ok了。
------------------------------rabbitmq相关--------------------------------------------------------
项目结构如下:
使用前,需要三个方面:celery配置,celery实例,需执行的任务函数,如下:
Celery 的配置比较多,可以在 官方配置文档: 查询每个配置项的含义。
当然,要保证上述异步任务and下述定时任务都能正常执行,就需要先启动celery worker,启动命令行如下:
需 启动beat ,执行定时任务时, Celery会通过celery beat进程来完成。Celery beat会保持运行, 一旦到了某一定时任务需要执行时, Celery beat便将其加入到queue中. 不像worker进程, Celery beat只需要一个即可。而且为了避免有重复的任务被发送出去,所以Celery beat仅能有一个。
命令行启动:
如果你想将celery worker/beat要放到后台运行,推荐可以扔给supervisor。
supervisor.conf如下: