官方文档
http://docs.celeryproject.org/en/3.1/configuration.html#amqp-backend-settings
rabitmq的安装:http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#id3
python任务调度模块celery https://blog.csdn.net/weixin_39934221/article/details/80468242
https://www.jianshu.com/p/42b98f5eacb3
https://blog.csdn.net/u011138533/article/details/76497780
使用Celery (异步任务的调度工具)
简单来说,rabbitmq是一个采用Erlang写的强大的消息队列工具。在celery中可以扮演broker的角色。
那么什么是broker?(中文翻译:经纪人,代理人,中间人)
broker是一个消息传输的中间件,可以理解为一个邮箱(消息队列)。每当应用程序调用celery的异步任务的时候,会向broker传递消息,而后celery的worker将会取到消息,进行对于的程序执行。
Celery 支持 RabbitMQ、Redis 甚至其他数据库系统作为其消息代理中间件。
那么什么又是backend?通常程序发送的消息,发完就完了,可能都不知道对方时候接受了。为此,celery实现了一个backend,用于存储这些消息以及celery执行的一些消息和结果。对于 brokers,官方推荐是rabbitmq和redis,至于backend,就是数据库啦。为了简单起见,我们都用redis。
celery的架构图一
celery beat: 任务调度器,beat进程会读取配置文件的内容,周期性的将配置中到期需要执行的任务发送给任务队列。
celery worker: 执行任务的消费者,通常会在多台服务器运行多个消费者 来提高执行效率。
broker: 消息代理,或者叫做消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)
producer: 调用了celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
result backend: 任务处理完后保存状态信息和结果,以供查询。celery默认已支持redis、 rabbitmq、 mongoDB、django ORM等方式
celery的架构图二
任务生产者 (task producer)
任务生产者 (task producer) 负责产生计算任务,交给任务队列去处理。在 Celery 里,一段独立的 Python 代码、一段嵌入在 Django Web 服务里的一段请求处理逻辑,只要是调用了 Celery 提供的 API,产生任务并交给任务队列处理的,我们都可以称之为任务生产者。
任务调度器 (celery beat)
Celery beat 是一个任务调度器,它以独立进程的形式存在。Celery beat 进程会读取配置文件的内容,周期性地将执行任务的请求发送给任务队列。Celery beat 是 Celery 系统自带的任务生产者。系统管理员可以选择关闭或者开启 Celery beat。同时在一个 Celery 系统中,只能存在一个 Celery beat 调度器。
任务代理 (broker)
任务代理方负责接受任务生产者发送过来的任务处理消息,存进队列之后再进行调度,分发给任务消费方 (celery worker)。因为任务处理是基于 message(消息) 的,所以我们一般选择 RabbitMQ、Redis 等消息队列或者数据库作为 Celery 的 message broker。
任务消费方 (celery worker)
Celery worker 就是执行任务的一方,它负责接收任务处理中间方发来的任务处理请求,完成这些任务,并且返回任务处理的结果。Celery worker 对应的就是操作系统中的一个进程。Celery 支持分布式部署和横向扩展,我们可以在多个节点增加 Celery worker 的数量来增加系统的高可用性。在分布式系统中,我们也可以在不同节点上分配执行不同任务的 Celery worker 来达到模块化的目的。
结果保存
Celery 支持任务处理完后将状态信息和结果的保存,以供查询。Celery 内置支持 rpc, Django ORM,Redis,RabbitMQ 等方式来保存任务处理后的状态信息。
celery适用的场景
Celery是一个基于Python开发的分布式异步消息任务队列,它简单、灵活、可靠,是一个专注于实时处理的任务队列,同时也支持任务调度。通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用Celery。举几个适用场景:
1)可以在 Request-Response 循环之外执行的操作(可以异步执行的任务):发送邮件、推送消息。清理/设置缓存等。
2)web应用。当用户触发的一个操作需要较长时间才能执行完成时,可以把它作为任务交给celery去异步执行,执行完成后再返回给用户。耗时的操作:调用第三方 API、视频处理(前端通过 AJAX 展示进度和结果)。
3)定时任务(周期性任务):取代 crontab。
Celery有以下几个优点:
简单:一旦熟悉了Celery的工作流程后,配置和使用是比较简单的。
高可用:当任务执行失败或执行过程中发生连接中断,Celery 会自动尝试重新执行任务。
快速:一个单进程的Celery每分钟可处理上百万个任务。
灵活: Celery的大部分组件都可以被扩展及自定制。
常用的Broker有RabbitMQ、Redis、数据库等,我们这里使用的是RabbitMQ,如下图2-2所示:
celery安装
安装celery,提供了bundles方式,也就是安装celery 的同事可以一起安装多种依赖。
pip install "celery[librabbitmq,redis,msgpack]"
安装完成后会在PATH(或virtualenv的bin目录)添加几个命令:celery(主要用这个)、celerybeat、celeryd 和celeryd-multi
Celery的默认broker是RabbitMQ,仅需配置一行就可以:
broker_url = 'amqp://guest:guest@localhost:5672//'
rabbitMQ 没装的话请装一下,安装看这里http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#id3