Celery学习笔记(一)
什么是Celery
Celery是一个python模块,它在官网的定义:
Celery is asynchronous task queue/job based on distributed message passing. It is focused on real-time operation, but supports scheduling as well.
这里强调的概念包括:异步任务队列 / 分布式消息传递 / 实时或调度任务,下面对这些概念分别做解释
为什么要使用Celery
Celery是一个使用Python开发的分布式任务调度模块,因此对于大量使用Python构建的系统,可以说是无缝衔接,使用起来很方便。Celery专注于实时处理任务,同时也支持任务的定时调度。因此适合实时异步任务定时任务等调度场景。
Celery任务队列
任务队列是一种在进程或机器之间分发任务的机制。
任务队列的输入是被称为任务(task)的工作单元。专用的工作进程会时刻监控任务队列,来获取要执行的任务。
celery的client和worker通过消息来“沟通“。Celery需要依靠RabbitMQ等作为消息代理,同时也支持Redis甚至是Mysql,Mongo等,当然,官方默认推荐的是RabbitMQ。
为了开始一个任务,client需要向队列中发送任务消息,然后broker会把任务投递给worker处理。一个celery系统可以包含多个worker和broker,以便实现高可用和可水平扩展。
如何安装Celery
选择broker
RabbitMQ 功能完备、稳定、耐用,并且安装简便,是生产环境的绝佳选择。
sudo apt-get install rabbitmq-server
命令执行完成后,中间人就已经运行在后台,准备好传输消息
为了方便之后分布式部署的时候通过RabbitMQ进行沟通,我们需要创建一个 RabbitMQ 用户、一个虚拟主机,并且允许这个用户访问这个虚拟主机:
$ sudo rabbitmqctl add_user myuser mypassword
$ sudo rabbitmqctl add_vhost myvhost
$ sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"
RabbitMQ的Python客户端选择librabbitmq这个C库。
分布式的时候:一定要显式指定rabbitMQ的用户名,密码,server的IP,虚拟主机。
eg:
broker=’amqp://danny:123456@192.168.1.128:5672/myvhost’
否则在worker开始工作的时候会出现如下错误:ACCESS_REFUSED Login was refused
安装celery
Celery 提交到了 Python Package Index(PyPI)上,所以你可以用标准的 Python 工具,诸如 pip 或 easy_install 来安装:
$ pip install celery