之前在公司的一个模块,需要从另一处url取得数据,我使用了Python的一个很著名的lib,叫做requests。但是这样做极大的降低了程序的性能,因为tornado是单线程的,它使用了所谓的reactor模式,底层使用epoll监听每个tcp连接,上层再经过封装,接受HTTP请求。所以,tornad实际上是单线程的。

在实际的场景中,经常采用nginx反向代理的模式,然后服务器开启多个tornado进程,接受nginx发送过来的请求。

刚才的问题主要是,因为requests是阻塞的,所以当我发出一个post请求,整个tornado进程就阻塞了,此时该进程不能接受任何的其他请求。

想想我们的服务器总共才十几个tornado进程,可能要应对上千的并发量,所以阻塞一个进程对我们是巨大的损失。

tornado内置了异步的模块,例如AsyncHttpClient,它的使用如下:

class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
http = tornado.httpclient.AsyncHTTPClient()
http.fetch("http://friendfeed-api.com/v2/feed/bret",
callback=self.on_response) def on_response(self, response):
if response.error: raise tornado.web.HTTPError(500)
json = tornado.escape.json_decode(response.body)
self.write("Fetched " + str(len(json["entries"])) + " entries "
"from the FriendFeed API")
self.finish()

那么,tornado的gen是怎么回事? 可以看到,上面的代码中使用了回调函数,但是回调函数有一个致命的问题,如果逻辑非常复杂,那么我们的程序可能嵌套多层回调,造成所谓的“回调地狱”。

事实上,tornado的gen模块,就是为了改善这一问题。例如:

class GenAsyncHandler(RequestHandler):
@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response = yield http_client.fetch("http://example.com")
do_something_with_response(response)
self.render("template.html")

从上面可以看出,gen模块的最大作用,就是将异步代码的编写进行改进,使其看起来像同步。

上面的代码执行时,遇到yield后面的阻塞调用则暂停,然后去执行其他请求,等该数据返回时,再继续处理这里。

这样就防止了一个IO操作阻塞整个进程。

在实际应用中,对于可能阻塞的操作(例如查询量较大的数据库查询),最好使用异步。

使用tornado的gen模块改善程序性能的更多相关文章

  1. .net改善程序性能建议

    对改善程序性能的建议. 文章:https://msdn.microsoft.com/zh-cn/library/ms973838.aspx

  2. 利用GPU改善程序性能的一点心得

    1.     硬件方面 a. 流处理器个数    Gpu内部的计算单元个数,决定分析模块实时性的关键因素.    实测效果: gtx760  1152个 Gtx960  1024个 单路1080p运动 ...

  3. Matlab优化存储器读写来改善程序性能

    最近用Matlab写程序的时候终于遇到了程序执行效率的问题,于是在Google上面搜索了一篇提高代码性能的文章,简单的概括一下. 文章是通过优化寄存器读写来提高执行速度的,主要体现在三个方面: 在做循 ...

  4. tornado.gen 模块解析

    转自:http://strawhatfy.github.io/2015/07/22/Tornado.gen/ 引言 注:正文中引用的 Tornado 代码除特别说明外,都默认引用自 Tornado 4 ...

  5. 细数改善WPF应用程序性能的10大方法

    WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...

  6. Web标准中用于改善Web应用程序性能的各种方法总结

    提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...

  7. 改善WPF应用程序性能的10大方法 (转发)

    WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系 ...

  8. 跨多种环境部署 Gearman -改善应用程序性能和降低服务器负载

    您可能想要将工作扩散到一个大型机器群体中,或者想要在不同语言和环境之间共享功能,那么开放源码的 Gearman 服务可以让您轻松地将工作分布到网络中的其他机器.本文将介绍 Gearman 的一些典型应 ...

  9. 改善Azure App Service托管应用程序性能的几个技巧

    本文介绍了几个技巧,这些技巧可以改善Azure App Service托管应用程序的性能.其中一些技巧是你现在就可以进行的配置变更, 而其他技巧则可能需要对应用程序进行一些重新设计和重构. 开发者都希 ...

随机推荐

  1. Oracle基础知识笔记

    1.打开oracle相关服务 2.创建Oracle用户 create user 用户名 identified by 密码;(需要dba角色创建) 3.权限管理 (1)添加权限 grant  权限.角色 ...

  2. 深入理解JVM内存模型

    1.程序计数器在虚拟机的概念模型里字节码解释器工作时就是通过改变 这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. Java 虚拟机的多线程是通过线程轮流切换并分配处理器执 ...

  3. hdu 5720 Wool

    hdu 5720 问题描述 黎明时,Venus为Psyche定下了第二个任务.她要渡过河,收集对岸绵羊身上的金羊毛. 那些绵羊狂野不驯,所以Psyche一直往地上丢树枝来把它们吓走.地上现在有n n ...

  4. OA项目之弹出层中再弹出层

    弹出层中再弹出一层如图: <asp:TextBox runat="server" ID="txtUName" CssClass="span2&q ...

  5. 第六章 springboot + 事务

    在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是servic ...

  6. Verilog之基本算数运算

    1.加减法 module addsub ( :] dataa, :] datab, input add_sub, // if this is 1, add; else subtract input c ...

  7. 使用my exclipse对数据库进行操作(2)

    二.增加 public static void main(String[] args) {  //TODO Auto-generated method stub //4.用户输入需要添加的项目     ...

  8. Java多线程死锁的产生实例

    死锁产生的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用.(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放.(3) 不剥夺条件:进程已获得的资源,在末使用完 ...

  9. c# XML序列化与反序列化 属性字段标识

    序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAt ...

  10. PHP会话处理相关函数介绍

    PHP会话处理相关函数介绍 提交 我的评论 加载中 已评论 PHP会话处理相关函数介绍 2015-03-23 PHP100中文网 PHP100中文网 PHP100中文网 微信号 功能介绍 互联网开发者 ...