一、介绍
celery是一个基于python开发的分布式异步消息任务队列,用于处理大量消息,同时为操作提供维护此类系统所需的工具。
它是一个任务队列,专注于实时处理,同时还支持任务调度。如果你的业务场景中需要用到异步任务,就可以考虑使用celery
二、实例场景
1、你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。
2、你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福
三、优点
- 1、简单:一但熟悉了celery的工作流程后,配置和使用还是比较简单的
- 2、高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
- 3、快速:一个单进程的celery每分钟可处理上百万个任务
- 4、灵活:几乎celery的各个组件都可以被扩展及自定制
四、入门
celery 需要一个解决方案来发送和接受消息,通常,这是以称为消息代理的单独服务的形式出现的
有以下几种解决方案,包括:
一:RabbitMQ(消息队列,一种程序之间的通信方式)
rabbitmq 功能齐全,稳定,耐用且易于安装。它是生产环境的绝佳选择。
如果您正在使用Ubuntu或Debian,请执行以下命令安装RabbitMQ:
$ sudo apt-get install rabbitmq-server
命令完成后,代理已经在后台运行,准备为您移动消息:。Starting rabbitmq-server: SUCCESS
二、redis
redis功能齐全,但在突然中止或者电源故障时更容易丢失数据
五、安装
$ pip install celery
六、应用
创建一个tasks.py文件
from celery import Celery app = Celery('tasks', broker='pyamqp://guest@localhost//') @app.task def add(x, y): return x + y
第一个参数Celery是当前模块的名称。只有在__main__模块中定义任务时才能自动生成名称。
第二个参数是broker关键字参数,指定要使用的消息代理的URL。这里使用RabbitMQ(也是默认选项)。
您可以使用RabbitMQ amqp://localhost,或者您可以使用Redis redis://localhost。
您定义了一个名为add的任务,返回两个数字的总和。
1 from __future__ import absolute_import 2 import os 3 from celery import Celery 4 from django.conf import settings 5 # set the default Django settings module for the 'celery' program. 6 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'saruman_server.settings') 7 app = Celery('saruman_server') 8 9 # Using a string here means the worker will not have to 10 # pickle the object when using Windows. 11 app.config_from_object('django.conf:settings') 12 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 13 14 @app.task(bind=True) 15 def debug_task(self): 16 print('Request: {0!r}'.format(self.request))