异步回调程序的原理和写法我不就不介绍了,因为我主要是来吐槽下这种代码风格的。
最近因为追求性能所以去看了下tornado,然后发现这货如果你要利用它的高性能 ,那么你就要写回调代码,跟twisted一样,各种callback。
我们正常的同步代码一般是这样的
res = db.query(...) res2 = dosomething(res) res3 = db.insert(...) return res3
上面的代码共四行,2次数据库操作,一次数据处理最后返回想要的结果。逻辑很清晰也很易懂,我想大部分的程序都是这样的。但如如果是异步的写法就会这么写
db.query(...,callback=fun2) def fun2(res): res2 = dosomething(res,callback=fun3) def fun3(res): db.insert(...,callback=fun4)
异步的代码就是只要你涉及到阻塞的代码就需要使用回调,呵呵,看到了吧2次阻塞就要求你把一段代码写成3段,代码易读性直线下降,如果你只是做一些简单的功能,代码也不多,我觉得还是能接受的,毕竟性能真的好,但是如果你要做一个很大的项目,一个请求可能要做4,5次阻塞操作,不敢想象,简直就是个灾难。
不过好在tornado还给了我们另一条活路,那就是tornado.gen http://www.tornadoweb.org/documentation/gen.html。
简单点说就是gen 给了我们用同步代码来做异步实现的可能。
我们来看看gen和普通异步代码。
class BaseHandler(tornado.web.RequestHandler): @property def db(self): if not hasattr(self, "_db"): self._db = asyncmongo.Client(pool_id='test_pool', **settings.get('mongo_database')) return self._db def api_response(self, data): """将数据转成json返回给客户端""" self.set_header("Content-Type", "application/json; charset=UTF-8") data = dumps(data) self.finish(data) class A(BaseHandler): """ 同步代码实现异步 """ @tornado.web.asynchronous @gen.engine def get(self): res = self.get_user() @tornado.web.asynchronous @gen.engine def get_user(self): user_id = 'asdf'+str(random.randrange(1,490000)) #随机产生一个数据库里有的用户 res = yield gen.Task(self.db.user.find,{'name':user_id},limit=1) res=res[0][0][0] self.api_response(res) class B(BaseHandler): """ 异步代码 """ @tornado.web.asynchronous def get(self): user_id = 'asdf'+str(random.randrange(1,490000))#随机产生一个数据库里有的用户 self.db.user.find({ 'name': user_id }, callback=self.async_callback(self.finish_save)) def finish_save(self, response, error): self.api_response(response[0])
最后的最后我分别测试了2中写法最后在性能上的结果,我用ab -n 10000 -c 200 做了测试
gen 的代码 用了7秒
普通的异步代码 用了6.3秒
我觉得gen 略慢吧,但还是在可接受范围内,毕竟我不用写你妹的回调了。。。。怨念
当然 如果大家不是写web 就直接用gevent 吧,连这些gen的装饰器都可以省了。
相关推荐
trequests, python 请求的Tornado 异步 http/https客户端适配器 trequests 用于python请求的Tornado 异步 http/https客户端适配器。问题enjoy 使用来构建快速阻止网络应用程序,希望使用库中库,并希望使用库中库,...
龙卷风-redis 简单的异步 Tornado-redis 连接器 去做: 处理与 ioloop.WRITE 的连接 处理第二次和更多读取操作
tornado_apns, 在PyAPNS上,基于 Tornado的异步 APNS tornado_apns用于与苹果推送通知服务( APNs ) 进行 Tornado 异步编程的python 库示例用法import timefrom apns import APNs, Payloadfrom
AsyncTorndb, 用于 Tornado的异步mysql客户端 AsyncTorndb ( 非活动)面向 Tornado的异步mysql客户端,基于 PyMySQL 。文档AsyncTorndb行为几乎与torndb行为相似,但异步。 请参考 torndb 并尝试。要求使用最新版本的...
Tornado 异步请求演示Tornado 和 PostgreSQL 异步请求的演示应用程序。要求龙卷风桃子psycopg2跑步$ python app.py设置要使用数据设置测试表,请将浏览器定位到用法只需打开浏览器并将浏览器定位到 ,其中 1 是用于...
python-tornado框架
龙卷风-asyntool 一个简单的工具让 tornadoweb 异步运行代码受龙卷风 netutils、解析器的启发
RethinkDB + Tornado 聊天演示 使用 Async RethinDB Driver ,带有更改提要和 Longpolling。 更改提要使 #这个怎么运作 当新的聊天消息到达时,它会被插入到events表中,RethinkDB 会自动通知 changfeed 监听器。 ...
Tornado框架的异步非阻塞特性是其最大的亮点,这里我们将立足于基础来介绍一种简单的Python的Tornado框架实现异步非阻塞访问数据库的示例:
为了让生活变得更轻松,幸运的人们,我创建了trequests ,一个异步请求适配器,该适配器使用greenlets(通过tornalet)和Tornado中内置的非阻塞HTTP客户端方法来对库进行任何调用(利用Requests )非阻塞。...
tornado_async_mysqltornado异步mysql操作,同步mysql操作对比#配置config文件夹下配置mysql数据库#运行运行后在浏览器中输入:127.0.0.1:8888/async 运行数据库异步操作127.0.0.1:8888/sync 运行数据库同步操作...
作为Web框架,是一个轻量级的Web框架,类似于另一个Python web框架Web.py,其拥有异步非阻塞IO 的处理方式。 作为Web服务器,Tornado 有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它 Python ...
龙卷风异步tcp 异步 tcp 服务器和客户端 使用 tornado 创建 tcp 服务器和客户端。
龙卷风框架的异步Whois客户端 例子 from tornado import ioloop, gen from tornadowhois import AsyncWhoisClient @gen.coroutine def main(): data = yield AsyncWhoisClient().lookup("example.com") print data...
Torando 在Linux和FreeBSD上使用高效的异步I/O模型 epoll 和kqueue来实现高效的web服务器, 所以 tornado在Linux上和FreeBSD系列性能可以达到最高 接口 当然我们可以不仅仅把Tornado看作是一个web框架和web服务器, ...
基于python异步io框架Tornado,结合JavaScript的onkeydown事件、 jQuery的mousedown、mouseup、touchstart、touchend事件以及Ajax,实现了监控遥控命令与web网页指定按键和鼠标(屏幕)点击事件的绑定,同时也实现了...
tornado新版, 狂暴的心, 异步非阻塞框架
得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 ...
tornado 入门开发 Tornado is different from most Python web frameworks. It is not based on WSGI, and it is typically run with only one thread per process. See the User’s guide for more on Tornado’s ...
使用 Tornado 的 httpclient 的 CouchDB 的阻塞和非阻塞(异步)客户端 这个 Python 模块包装了 CouchDB HTTP REST API 并定义了一个通用接口,用于在 CouchDB 上进行阻塞和非阻塞操作。 安装 使用pip安装: pip ...