tornado的同步框架与其他web框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了。一直处于等待过程中。但是请求一旦得到响应,那么:

  • 请求发送过来后,将需要的本站资源直接返回给客户端
  • 请求发送过来后,本站没有需要的资源,从其它站点获取过来,再返回给客户端

一、Tornado中的同步框架

1、本站资源直接返回

import tornado.web
import time class LoginHandler(tornado.web.RequestHandler): def get(self):
time.sleep(10) #第一个请求来后等10s,后面的请求无法处理,只有等这个请求结束后才能处理其他的请求
self.write('LoginHandler') def post(self):
pass class IndexHandler(tornado.web.RequestHandler): def get(self):
self.write('IndexHandler') def post(self):
pass application=tornado.web.Application([
(r'/login/',LoginHandler),
(r'/index/', IndexHandler), ],) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

可以看到因为回调函数中阻塞了10s,所以后面的请求必须等这个回调函数结束后才能处理后面的请求,在tornado中使用future对象进行异步处理。

2、从其它站点获取资源再返回

import tornado.web
import requests class LoginHandler(tornado.web.RequestHandler): def get(self):
requests.get('http://www.baidu.com') #此时无法处理其它请求
self.write('LoginHandler') def post(self):
pass class IndexHandler(tornado.web.RequestHandler): def get(self):
self.write('IndexHandler') def post(self):
pass application=tornado.web.Application([
(r'/login/',LoginHandler),
(r'/index/', IndexHandler), ],) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

从其它站点获取资源的过程也是阻塞的,服务端处理不了其它请求,必须等这个请求处理完毕才能处理其它请求。

二、Tornado中的异步框架

对于上面的两种情况tornado也是有对策的,就是使用future对象,进行异步处理。

1、本站资源直接返回

import tornado.web
from tornado import gen
from tornado.concurrent import Future
import time class LoginHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
future=Future()
tornado.ioloop.IOLoop.current().add_timeout(time.time()+10,self.done) #此处的10s延迟不会影响处理其它请求
yield future def done(self,*args,**kwargs):
self.write('LoginHandler')
self.finish() def post(self):
pass class IndexHandler(tornado.web.RequestHandler): def get(self):
self.write('IndexHandler') def post(self):
pass application=tornado.web.Application([
(r'/login/',LoginHandler),
(r'/index/', IndexHandler), ],) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

2、从其它站点获取资源再返回

import tornado.web
from tornado import gen
from tornado import httpclient class LoginHandler(tornado.web.RequestHandler): @gen.coroutine
def get(self):
http=httpclient.AsyncHTTPClient()
yield http.fetch('http://www.google.com',self.done) #访问其它网址不能用requests,应该使用tornado内置的,其实质也是返回future对象 def done(self,*args,**kwargs): self.write('LoginHandler')
self.finish() def post(self):
pass class IndexHandler(tornado.web.RequestHandler): def get(self):
self.write('IndexHandler') def post(self):
pass application=tornado.web.Application([
(r'/login/',LoginHandler),
(r'/index/', IndexHandler), ],) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

  tornado解决异步请求就是利用future对象。future对象中设定默认参数result=None,如果在某一时刻future的result中被设定值了,那么它就会自动执行回调函数,实际上这种执行回调函数的功能就是所谓的异步,不需要服务器等待,自己自动执行完后会进行回调(注意这都是在一个线程中)。详情参考:https://www.cnblogs.com/shenjianping/p/11622210.html

Tornado中异步框架的使用的更多相关文章

  1. 在 tornado 中异步无阻塞的执行耗时任务

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  2. 在tornado中使用celery实现异步任务处理之中的一个

    一.简单介绍 tornado-celery是用于Tornado web框架的非堵塞 celeryclient. 通过tornado-celery能够将耗时任务增加到任务队列中处理, 在celery中创 ...

  3. Python核心框架tornado的异步协程的2种方式

    什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...

  4. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...

  5. Tornado WEB服务器框架 Epoll

    引言: 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会 ...

  6. 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

    1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...

  7. tornado中使用torndb,连接数过高的问题

    问题背景 最近新的产品开发中,使用了到了Tornado和mysql数据库.但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show ...

  8. 深入tornado中的协程

    tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...

  9. 深入tornado中的TCPServer

    1 梳理: 应用层的下一层是传输层,而http协议一般是使用tcp的,所以实现tcp的重要性就不言而喻. 由于tornado中实现了ioloop这个反应器以及iostream这个对连接的异步读写,所以 ...

随机推荐

  1. webdriver原理

    WebDriver 安装C/S构架设计的: 代码(客户端)--->驱动(解析代码)----->浏览器(服务端) 代码通过http请求发给浏览器驱动,驱动解析代码把他们发给浏览器,浏览器执行 ...

  2. BZOJ2756 [SCOI2012]奇怪的游戏 最大流

    好久没有写博客了.不过这个博客也没有多少人看 最近在写网络流,为了加深理解,来写一两篇题解. 对整个棋盘进行黑白染色以后可以发现,一次操作就是让二分图的两个点的值分别 \(+1\). 这样,我们就可以 ...

  3. 【leetcode】878. Nth Magical Number

    题目如下: 解题思路:本题求的是第N个Magical Number,我们可以很轻松的知道这个数的取值范围 [min(A,B), N*max(A,B)].对于知道上下界求具体数字的题目,可以考虑用二分查 ...

  4. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法

    SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备 ...

  5. WCDB错误"No matching constructor for initialization of 'WCTColumnBinding'"

    开始看到这个错误有点匪夷所思,完全不知道问题指向哪里, 最后用过排除法,把之前建立多个类进行了一一排除,发现有个属性是 @property(nonatomic, assign) NSInteger * ...

  6. XX-net https://github.com/XX-net/XX-Net

    XX-net https://github.com/XX-net/XX-Net

  7. 关于Java中编码集的有趣现象和解释

    这是在整理另一篇博客的时候发现的一个有趣的现象,是这样描述的:我们都知道Java默认使用的是UniCode编码集,我们也知道char类型占用两个字节.所以奇怪的现象又发生了(见代码): @Test p ...

  8. Linux(Ubuntu)常用命令(一)

    Linux先知: Linux历史: 关于这个我就不再多说了,其实是一个很有意思的故事串,网上找下一大堆. 类Unix系统目录结构: ubuntu没有盘符这个概念,只有一个根目录/,所有文件都在它下面 ...

  9. Objective-C Properties 详解

    关于Objective-C 的property,很多iOS开发的新手都会很迷惑,也会包括有经验的iOS开发程序员, 因为Objective-C的property,说多不多,说少却也不少,从MRR(Ma ...

  10. qtp的三种录制模式(转)

    QTP提供三种不同的录制方式:正常录制(Normal Recording).模拟录制(Analog Recording)和低级录制(Low Level Recording). 1.正常录制(Norma ...