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. SPOJ1693 COCONUTS - Coconuts

    传送门[洛谷] 自闭QAQ 什么玩意QAQ 不是很理解到底在干啥 问了巨佬以后大概是这个样子的 可以看出是最小割模型 对于每一个人 反悔的话就是代价+1 那么连接(s,i) (i,t)分别表示他最后选 ...

  2. C#高级编程(32章)ADO.net

    32.2高效地使用连接 sqlConnection类是针对sql的,而OleDbConnection 是针对其他比如access的,另外还有odbcConnection是针对odbc的,sql的访问优 ...

  3. 【leetcode】897. Increasing Order Search Tree

    题目如下: 解题思路:我的方法是先用递归的方法找出最左边的节点,接下来再对树做一次递归中序遍历,找到最左边节点后将其设为root,其余节点依次插入即可. 代码如下: # Definition for ...

  4. mobx学习笔记03——mobx基础语法(decorator修饰器)

    在声明阶段实现类与类成员注解的一种语法. function log(target){ const desc = Object.getOwnPropertyDescriotors(target.prot ...

  5. Centos7.4 离线安装httpd(解决rpm依赖)

    1.直接下载httpd的rpm安装包,安装失败需要先解决依赖. [root@node06 ~]# rpm -ivh httpd--.el7.centos.x86_64.rpm warning: htt ...

  6. python每日练习--基础题

    """ 1. 现有面包.热狗.番茄酱.芥末酱以及洋葱,数字显 示有多少种订购组合, 其中面包必订,0 不订,1 订,比如 10000,表示只订购面包 "&quo ...

  7. 英语单词delimiter

    delimiter 来源——命令参数 [root@centos7 ~]# cat /good/passwd root:x:::root:/root:/bin/bash bin:x:::bin:/bin ...

  8. javascript中new关键字详解

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  9. manacher 和 扩展KMP

    manacher 和 扩展KMP 事实上,这两个东西是一样的. 考虑 manacher 的过程 我们实时维护最远扩展的位置 \(mx\) 以及这个回文串的回文中心 \(l\) ,那么显然当然位置如果没 ...

  10. flutter中的路由跳转

    在前面的基本路由和命名路由中,都演示了如何进行路由跳转,并且在路由跳转以后,可以借用系统自带的按钮就行返回上一级,当然了,也可以自定义按钮返回上一级. 返回上一级 在前面的例子中,当从Home.dar ...