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. JDBC简单总结

    几种常用数据库的JDBC URL 对于 Oracle 数据库连接,采用如下形式: jdbc:oracle:thin:@localhost:1521:sid 对于 SQLServer 数据库连接,采用如 ...

  2. C/C++ C++ 11 兰姆达

    { auto layer = Layer::create();    auto event = cocos2d::EventListenerTouchOneByOne::create();    ev ...

  3. XSS漏洞基础

    什么是XSS? XSS全程Cross-site scripting,跨站脚本攻击.恶意攻击者往Web页面里插入html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用 ...

  4. HihoCoder 1055 刷油漆 (树上背包)

    题目:https://vjudge.net/contest/323605#problem/A 题意:一棵树,让你选择m个点的一个连通块,使得得到的权值最大 思路:树上背包,我们用一个dp数组,dp[i ...

  5. python生成接口自动化测试报告模版

    1:准备html模版 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  6. oauth2学习

    oauth2 生词: 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials) 客户端模式( ...

  7. Kali开启SSH服务

    1.    一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no的注释去掉,并且将NO修 ...

  8. 学习php的步骤是什么?

    PHP应该学什么,如何学好PHP (注:原文来自传智播客) 一些共性问题,大致是: 1. 应该怎样学习PHP,学习的顺序是怎样的? 2. PHP学好后,可以做什么事情? 3. 听得懂课,但是一旦自己独 ...

  9. Springboot02-配置文件

    配置文件读取 springboot中的配置文件都放在application.properties中,其中而k-v属性可以通过@Value("${属性名}")直接获取 @Compon ...

  10. java反射(四)--反射与简单java类

    一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...