多线程和gevent如何提高celery性能及稳定性

有朋友问我,我那个任务队列是怎么实现,他的疑问其实主要是celery不支持多线程。先说说我那实现的方法,其实我的做法和celery、rq这样的框架很像的,都是把任务push到队列里面,然后pull取出任务而已,celery里面还可以取任务,我这个是通过传送uuid来实现的。   朋友问celery不支持多线程,那是他没有好好看文档。celery是支持多任务并发的,哎。。。 好好看文档呀。

队列存储brokers用的是rabbitmq,后面测试下用mongodb搞搞。我这里做个测试:

下面是tasks.py文件,也就是celery能支持异步的函数。

 代码如下 复制代码

@app.task
def add(x, y):
    wlog()
    sleep(10)
    return x + y

后端启动含有100个线程的线程池。

 代码如下 复制代码
celery -A tasks worker  -c 100 --loglevel=info

在ipython测试的结果:

看看我自己输出的日志,结果很明显,是并发的:

celery是支持好几个并发模式的,有prefork,threading,协程(gevent,eventlet)

prefork在celery的介绍是,用了multiprocess来实现的。多线程就补多少了,估计大家都懂。

说说协程,进程 线程经常玩,也算熟悉,话说协程算是一种轻量级进程,但又不能叫进程,因为操作系统并不知道它的存在。什么意思呢,就是说,协程像是一种在程序级别来模拟系统级别的进程,由于是单进程,并且少了上下文切换,于是相对来说系统消耗很少,而且网上的各种测试也表明,协程确实拥有惊人的速度。并且在实现过程中,协程可以用以前同步思路的写法,而运行起来确是异步的,也确实很有意思。话说有一种说法就是说进化历程是多进程->多线程->异步->协程,当然协程也有弊端,但是如果你的任务类型不是那种cpu密集的,那选用协程是个好选择。

但是需要说明的是,虽然celery官网提示说,只要在启动worker的时候,指明下类型就行了,但是如果你逻辑里面的模块有些不支持协程 gevent或者是eventlet异步的话,他还是会堵塞的。

gevent1.x之后虽然是支持subprocess的用法,gevent这个模块给非堵塞了,和他有同样功能的os.popen('sleep 10').read() 是会堵塞的,据说gevent官方不支持popen的协程的用法。

看了下celery 针对gevent方面的调用,他其实就是引入了gevent的patch  。 那这样会造成堵塞的问题,如果gevent不支持这些模块,那。。。。

 代码如下 复制代码

from gevent import monkey
monkey.patch_all()

反之threading的用法倒是简单明了,支持把任务放在线程pool里面来处理。

话说回来,我的title为什么说gevent来提高性能。我和小伙伴做一些gevent支持的模块写函数,做多任务处理的时候,性能确实要比threading要高,还要稳定。


小计:

清理celery产生的数据

 代码如下 复制代码
#清空
celery purge
#清空
from celery.task.control import discard_all
discard_all()

查看celery rabbitmq队列信息

 代码如下 复制代码
rabbitmqctl list_queues

 

时间: 2024-12-22 15:12:54

多线程和gevent如何提高celery性能及稳定性的相关文章

ARM计划增加多线程技术以提高处理器性能

ARM计划为处理器增加多线程技术,以提高处理器性能. ARMhttp://www.aliyun.com/zixun/aggregation/17728.html">架构处理器被广泛应用在智能手机中,ARM计划涉足新领域,例如服务器.网络和通信.ARM本月公布的Cortex-A15处理器内核不支持多线程技术.多线程技术可以在一个处理器内核上运行多个线程,提高应用运行的性能.英特尔的笔记本和台式机处理器,以及IBM和Sun的处理器都支持多线程技术. 市场研究公司J. Gold Associat

提高代码性能技巧谈—以创建千行表格为例

创建|技巧|性能 微软的开发周期中很重要的一块是调整产品的性能.性能调整也是开发者应当留心的关键部分之一. 经过多年发展,业界对于如何优化Win32程序性能已经有非常多的了解. 现在开发者遇到的问题之一是不太清楚是什么导致DTHML和HTML页面运行快或者慢.当然,有一些很简单的方法--比如不要使用2MB大的图片.我们曾经使用过另外一些有趣的技巧提高了DHTML页面的性能,希望它们能帮助你改善自己的页面性能. 这里我使用了一个建立Table的程序例子.其中用document.createElem

提高ASP性能的22个技巧(二)

技巧|性能 技巧12:将常用数据复制到脚本变量中  当访问ASP中的COM对象时,应该将常用对象数据复制到脚本变量中.着将减少COM方法调用.而COM方法调用代价相对比访问脚本数据更高.当访问Collection和 Dictonary对象时,这项技术也能消减高昂的查询代价.  通常,当准备不止一次访问一个对象数据时,应该将这个数据放当一个脚本对象中. 这项优化的主要目标是Request变量(Form和QueryString变量).例如,你的站点传递一个叫UserID的QueryString变量,

提高ASP性能的最佳选择2

性能 是否应该开启缓冲器? 通过脚本程序启动缓冲器 在ASP脚本的顶部包含Response.Buffer=True ,IIS就会将页面的内容缓存. < % OPTION EXPLICIT Response.Buffer = true Dim FirstName - /app1/buffer__1.asp的片段 以前的最佳(反应时间)= 7.05 msec/page 反应时间 = 6.08 msec/page 差= -0.97 msec (降低13.7%) 性能得到了极大提高.但是等等,还能有更好

[收藏]五种提高 SQL 性能的方法

性能 五种提高 SQL 性能的方法发布日期: 4/1/2004 | 更新日期: 4/1/2004Johnny Papa Data Points Archive 有时, 为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整.啊,但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的 SQL 查询不能按照您想要的方式进行响应.它要么不返回数据,要么耗费的时间长得出奇.如果它降低了报告或您的企业应用程序的速度,用户必须等待的时间过长,他们就会很不满意.就像您的父母不想听您解释

虚拟主机如何提高整体性能-application的使用

application|性能|虚拟主机 我们经常会发现,当网站的访问量不断的上升的时候,是一件高兴的事情,但是我也发现,访问量的上升也带来了服务器的负担加重,特别是对于虚拟主机的用户,现在网络上的虚拟主机提供商主要采用的cpu上限控制,当服务器程序(网页程序)的cpu占用超过了一个限制以后,后边再来的访问者就会被拒绝访问,这对于一个蓬勃发展的网站确实是一个不小的打击,有什么办法提高整体性能呢? 首先我应该检查一下,我们的什么服务器程序导致了cpu资源的严重浪费,我们发现,浪费一般发生在对文件或者

使用查询改写提高查询性能

性能 无需改变SQL查询就可以大幅提高查询性能. 你是否为等待你的查询返回结果而感到疲惫?你是否已经为增强索引和调优SQL而感到疲惫,但仍然不能提高查询性能?那么,你是否已经考虑创建物化视图?有了物化视图,那些过去需要数小时运行的报告可以在几分钟内完成.物化视图可以包括联接(join)和集合(aggregate),它提供了一种储存预计算结果的方法. 在执行一个查询时,优化器会判定访问物化视图或数据驻留的基础表是否更快一些.如果优化器判定查询物化视图是更好的解决方案,那么优化器会在一个被称为"查询

利用Oracle执行计划机制提高查询性能

oracle|性能|执行 消耗在准备利用Oracle执行计划机制提高查询性能新的SQL语句的时间是Oracle SQL语句执行时间的最重要的组成部分.但是通过理解Oracle内部产生执行计划的机制,你能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能. 准备执行SQL语句 当SQL语句进入Oracle的库缓存后,在该语句准备执行之前,将执行下列步骤: 1) 语法检查:检查SQL语句拼写是否正确和词序. 2) 语义分析:核实所有的与数据字典不一致的表和列的名字. 3) 轮

通过缓存数据库结果提高PHP性能

缓存|数据|数据库|性能 众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得到满足,从而不必连接到数据库.执行查询以及获取结果. 但当您使用的数据库与 Web 服务器位于不同的计算机上时,缓存数据库结果集通常是一个不错的方法.不过,根据您的情况确定最佳的缓存策略却是一个难题.例如,对于使用最新数据库结果集比较重要的应用程序而言,时间触发的缓存方法(