黄瓜视频ios,海口seo推广公司,平顶山建设局网站,建设银行网站定酒店celery的简介 celery是一个基于分布式消息传输的异步任务队列#xff0c;它专注于实时处理#xff0c;同时也支持任务调度。它的执行单元为任务#xff08;task#xff09;#xff0c;利用多线程#xff0c;如Eventlet#xff0c;gevent等#xff0c;它们能被并发地执行… celery的简介 celery是一个基于分布式消息传输的异步任务队列它专注于实时处理同时也支持任务调度。它的执行单元为任务task利用多线程如Eventletgevent等它们能被并发地执行在单个或多个职程服务器worker servers上。任务能异步执行后台运行或同步执行等待任务完成。 在生产系统中celery能够一天处理上百万的任务。它的完整架构图如下 组件介绍 Producer调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。Celery Beat任务调度器Beat进程会读取配置文件的内容周期性地将配置中到期需要执行的任务发送给任务队列。Broker消息代理又称消息中间件接受任务生产者发送过来的任务消息存进队列再按序分发给任务消费方通常是消息队列或者数据库。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理但适用于生产环境的只有RabbitMQ和Redis, 官方推荐 RabbitMQ。Celery Worker执行任务的消费者通常会在多台服务器运行多个消费者来提高执行效率。Result Backend任务处理完后保存状态信息和结果以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。 在客户端和消费者之间传输数据需要序列化和反序列化。 Celery 支出的序列化方案如下所示: 准备工作 在本文中我们使用的celery的消息代理和后端存储数据库都使用redis序列化和反序列化选择msgpack。 首先我们需要安装redis数据库具体的安装方法可参考http://www.runoob.com/redis/r... 。启动redis我们会看到如下界面 在redis可视化软件rdm中我们看到的数据库如下 里面没有任何数据。 接着为了能够在python中使用celery我们需要安装以下模块 celeryredismsgpack这样我们的准备工作就完毕了。 一个简单的例子 我们创建的工程名称为proj结构如下图 首先是主程序app_test.py代码如下 from celery import Celeryapp Celery(proj, include[proj.tasks])
app.config_from_object(proj.celeryconfig)if __name__ __main__:app.start() 分析一下这个程序 from celery import Celery是导入celery中的Celery类。app是Celery类的实例创建的时候添加了proj.tasks这个模块也就是包含了proj/tasks.py这个文件。把Celery配置存放进proj/celeryconfig.py文件使用app.config_from_object加载配置。 接着是任务函数文件tasks.py代码如下 import time
from proj.app_test import appapp.task
def add(x, y):time.sleep(1)return x y tasks.py只有一个任务函数add让它生效的最直接的方法就是添加app.task这个装饰器。add的功能是先休眠一秒然后返回两个数的和。 接着是配置文件celeryconfig.py代码如下 BROKER_URL redis://localhost # 使用Redis作为消息代理CELERY_RESULT_BACKEND redis://localhost:6379/0 # 把任务结果存在了RedisCELERY_TASK_SERIALIZER msgpack # 任务序列化和反序列化使用msgpack方案CELERY_RESULT_SERIALIZER json # 读取任务结果一般性能要求不高所以使用了可读性更好的JSONCELERY_TASK_RESULT_EXPIRES 60 * 60 * 24 # 任务过期时间CELERY_ACCEPT_CONTENT [json, msgpack] # 指定接受的内容类型 最后是调用文件diaoyong.py代码如下 from proj.tasks import add
import timet1 time.time()r1 add.delay(1, 2)
r2 add.delay(2, 4)
r3 add.delay(3, 6)
r4 add.delay(4, 8)
r5 add.delay(5, 10)r_list [r1, r2, r3, r4, r5]
for r in r_list:while not r.ready():passprint(r.result)t2 time.time()print(共耗时%s % str(t2-t1)) 在这个程序中我们调用了add函数五次delay()用来调用任务。 例子的运行 到此为止我们已经理解了整个项目的结构与代码。 接下来我们尝试着把这个项目运行起来。 首先我们需要启动redis。接着切换至proj项目所在目录并运行命令 celery -A proj.app_test worker -l info 界面如下 然后我们运行diaoyong.py输出的结果如下 3
6
9
12
15
共耗时1.1370790004730225 后台输出如下 接着我们看一下rdm中的数据 至此我们已经成功运行了这个项目。 下面我们尝试着对这个运行结果做些分析。首先我们一次性调用了五次add函数但是运行的总时间才1秒多。这是celery异步运行的结果如果是同步运行那么至少需要5秒多因为每调用add函数一次就会休眠一秒。这就是celery的强大之处。 从后台输出可以看到程序会先将任务分发出来每个任务一个ID在后台统一处理处理完后会有相应的结果返回同时该结果也会储存之后台数据库。可以利用ready()判断任务是否执行完毕再用result获取任务的结果。 本文项目的github地址为https://github.com/percent4/c... 。 本次分享到此结束感谢阅读~ 注意本人现已开通微信公众号 Python爬虫与算法微信号为easy_web_scrape 欢迎大家关注哦~~ 参考文献 Celery 初步http://docs.jinkan.org/docs/c... 使用Celeryhttps://zhuanlan.zhihu.com/p/... 异步神器celeryhttps://www.jianshu.com/p/9be...