分布式任务队列Celery
目录
Celery简介
随着信息时代的持续发展,越来越复杂的业务需求对自动化运维的要求上了一个新的台阶,任务调度系统也由单一主机任务调度系统向分布式任务调度系统过渡。无论是业务层面的作业调度还是运维本身的作业调度需求,分布式的任务也越来越普及。本章将介绍一个非常优秀的开源分布式任务队列——Celery。Celery是一个简单、灵活且可靠的,可以处理大量消息的分布式系统,并且提供了维护这样一个系统的必需工具。它是一个专注于实时处理的任务队列,同时也支持任务调度。
Celery是由纯Python编写的,但协议可以用任何语言实现。目前,已有Ruby实现的RCelery、Node.js实现的node-celery及一个PHP客户端,语言互通也可以通过using webhooks实现。在使用Celery之前,我们先来了解以下几个概念:
Celery概念
任务队列
任务队列:简单来说,任务队列就是存放着任务的队列,客户端将要执行任务的消息放入任务队列中,执行节点worker进程持续监视队列,如果有新的任务,就取出来执行该任务。这种机制就像生产者、消费者模型一样,客户端作为生产者,执行节点worker作为消费者,它们之前通过任务队列进行传递,
中间人
中间人(broker):Celery用于消息通信,通常使用中间人(broker)在客户端和worker之前传递,这个过程从客户端向队列添加消息开始,之后中间人把消息派送给worker。官方给出的实现broker的工具。
在实际使用中,我们选择RabbitMQ或Redis作为中间人。
安装Celery
我们可以从Python Package Index(PyPI)安装或者使用源代码安装Celery,推荐使用pip安装。
使用pip安装
pip3 install celery
使用源代码安装
(http://pypi.python.org/pypi/celery/)。
$ tar xvfz celery-0.0.0.tar.gz
$ cd celery-0.0.0
$ python setup.py build
$ python setup.py install #这里如果不是在virtualenv中安装,就需要使用root权限安装
Celery与Python3.7及以上的兼容性
https://www.cnblogs.com/breakcircle/p/12721335.html
报错”from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger”,
这是因为在 python 3.7 中将 async 作为了关键字,所以当 py 文件中出现类似 from . import async, base 这类不符合python语法的语句时,Python会报错;
解决方法: 在 celery 官方的提议下,建议将 kombu下的async.py 文件的文件名改成 asynchronous;然后把引用和这个文件的所有文件的里面的async改为asynchronous;