Tornado中异步框架的使用
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中异步框架的使用的更多相关文章
- 在 tornado 中异步无阻塞的执行耗时任务
在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...
- 在tornado中使用celery实现异步任务处理之中的一个
一.简单介绍 tornado-celery是用于Tornado web框架的非堵塞 celeryclient. 通过tornado-celery能够将耗时任务增加到任务队列中处理, 在celery中创 ...
- Python核心框架tornado的异步协程的2种方式
什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- Tornado WEB服务器框架 Epoll
引言: 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会 ...
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- tornado中使用torndb,连接数过高的问题
问题背景 最近新的产品开发中,使用了到了Tornado和mysql数据库.但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show ...
- 深入tornado中的协程
tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...
- 深入tornado中的TCPServer
1 梳理: 应用层的下一层是传输层,而http协议一般是使用tcp的,所以实现tcp的重要性就不言而喻. 由于tornado中实现了ioloop这个反应器以及iostream这个对连接的异步读写,所以 ...
随机推荐
- 2025年VR虚拟现实技术将渗透人们日常生活
2025年VR虚拟现实技术将给人们带来什么好处?今年早些时候,虚拟现实VR游戏制造商Survios在广州一个非常大的购物中心内的一个小型灰色墙壁店面,通过AMC中心植入了其位置游戏市场上的第一面旗帜. ...
- Redis中的GETBIT和SETBIT
来自:https://www.cnblogs.com/K-artorias/p/8463286.html Redis是in-memery的数据库,其优势不言而喻. 在学习到strings类型的常见命令 ...
- C/C++ C++ 11 std::function和std::bind用法
std::bind() std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的.两个点要明白: 1.绑定 ...
- C++ 分治思想 真假银币
#include "stdio.h" #include "iostream" #define MAXNUM 30 int FalseCoin(int coin[ ...
- npm和gem
https://blog.csdn.net/u011099640/article/details/53083845
- c#一些操作
C# FileStream 按大小分段读取文本内容 using System.IO; namespace FileStreamRead { class Program { static void Ma ...
- 查找android so文件中绕过c/c++ api直接调用SYSCALL的方法位置
很多应用会通过arm汇编,自行调用syscall,直接操作系统内核,来绕过c层的hook,保证程序安全 所以想hook的话只能找到这些方法的c入口分别hook 可以通过查找bxls指令找到这些位置
- JavaScript 类型浅解
对于JavaScript 类型,可简单地概括为:相对于强类型语言来说,它是弱(松散)类型的语言:有基本类型和引用类型,他们是区别是一个有固定空间存在于栈内存中,一个没有固定空间保存在堆内存中并且在栈内 ...
- 2019杭电多校第⑨场B Rikka with Cake (主席树,离散化)
题意: 给定一块n*m的矩形区域,在区域内有若干点,每个顶点发出一条射线,有上下左右四个方向,问矩形被分成了几个区域? 思路: 稍加观察和枚举可以发现,区域数量=射线交点数+1(可以用欧拉定理验证,但 ...
- electron测试TCP通信
这几天学习了一下Elctron,对于这个应用有了一点简单的认识,将这个过程记录一下. 首先,electron会加载main.js,在这里将整个程序启动,相当于其他程序的main函数了. 我是基于ele ...