文档章节

​​​​​​​tornado异步web请求

小家雀
 小家雀
发布于 2017/08/25 21:02
字数 878
阅读 1
收藏 0

1.为什么要使用异步web服务
使用异步非阻塞请求,并发处理更高效。

2.同步与异步请求比较
同步请求时,web服务器进程是阻塞的,也就是说当一个请求被处理时,服务器进程会被挂起直至请求完成。

异步请求时,web服务器进程在等待请求处理过程中,让I/O循环打开,以便服务于其他请求,请求处理完成后继续执行回调函数或生成器,而不再是等待请求过程中挂起进程。整个过程是异步的。

3.同步与异步请求示例
同步请求:

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        client=tornado.httpclient.HTTPClient()
        response=client.fetch("http://test.com/list")
        self.write("success")

异步请求:

复制代码

class IndexAsyncHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        client=tornado.httpclient.AsyncHTTPClient()
        client.fetch("http://test.com/list",callback=self.on_response)
    def on_response(self,response):
        self.write("success")
        self.finish()

复制代码

路由配置:

(r'/test', test_async.IndexHandler),
(r'/testasync', test_async.IndexAsyncHandle)

使用http_load工具(关于http_load的使用参见“http_load使用详解”)进行压力测试,结果如下:
同步压力测试:

复制代码

[root@51dev http_load-12mar2006]# ./http_load -p 100 -s 60 url
27 fetches, 100 max parallel, 189 bytes, in 60 seconds
7 mean bytes/connection
0.45 fetches/sec, 3.15 bytes/sec
msecs/connect: 0.113037 mean, 0.258 max, 0.021 min
msecs/first-response: 31186.5 mean, 59721.3 max, 2246.32 min
HTTP response codes:
code 200 -- 27

复制代码

异步压力测试:

复制代码

209 fetches, 100 max parallel, 1463 bytes, in 60.0046 seconds
7 mean bytes/connection
3.48306 fetches/sec, 24.3814 bytes/sec
msecs/connect: 0.0944641 mean, 0.387 max, 0.021 min
msecs/first-response: 20088 mean, 30650 max, 10601.1 min
HTTP response codes:
code 200 -- 209

复制代码

对比可以看出,在60s时间内,并发请求数量为100的情况下,
同步请求只有27个请求响应,而异步请求达到了209个

4.异步请求使用说明
同步请求在请求完毕后,自动关闭连接。
异步请求保持连接开启,需要手动关闭连接。
tornado中使用@tornado.web.asynchronous装饰器作用是保持连接一直开启,
回调函数执行完毕后,调用finish方法来主动关闭连接。

5.异步生成器
上例中,是使用回调函数来做业务处理及关闭连接的。
回调函数的缺点是,可能引起回调深渊,系统将难以维护。如回调中调用回调。

复制代码

def get(self):
    client = AsyncHTTPClient()
    client.fetch("http://example.com", callback=on_response)

def on_response(self, response):
    client = AsyncHTTPClient()
    client.fetch("http://another.example.com/", callback=on_response2)

def on_response2(self, response):
    client = AsyncHTTPClient()
    client.fetch("http://still.another.example.com/", callback=on_response3)

def on_response3(self, response):
    [etc., etc.]

复制代码

tornado2.1引入了tornado.gen模块,可以更整洁地执行异步请求。
异步请求:

复制代码

class IndexGenHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        client=tornado.httpclient.AsyncHTTPClient()
        response=yield tornado.gen.Task(client.fetch,"http://test.com/list")
        self.write("success")
        self.finish()

复制代码

路由配置:

(r'/testgen', test_async.IndexGenHandler),

异步压力测试:

复制代码

207 fetches, 100 max parallel, 1449 bytes, in 60.0055 seconds
7 mean bytes/connection
3.44968 fetches/sec, 24.1478 bytes/sec
msecs/connect: 0.113483 mean, 0.948 max, 0.024 min
msecs/first-response: 20156.5 mean, 32294.2 max, 9607.34 min
HTTP response codes:
code 200 -- 207

复制代码

tornado.gen是一个生成器(关于生成器参见“python生成器,函数,数组” ),
yield关键字的作用是返回控制,异步任务执行完毕后,程序在yield的地方恢复。
可以看到使用生成器,异步后业务处理不是在回调函数中完成的,看起来像同步处理一样,代码逻辑更清晰。
使用生成器和回调函数异步请求是一样的。

6.异步请求的适用场景
请求处理逻辑复杂耗时,或长时间请求数据库的时候,异步请求可以大幅提升并发请求效率。
同时综合考虑缓存,业务逻辑放在客户端等手段,来缓解服务器压力。

本文转载自:http://www.cnblogs.com/shijingjing07/p/6555439.html

上一篇: Tornado学习
下一篇: linux 下安装mysql
小家雀
粉丝 2
博文 59
码字总数 13963
作品 0
长春
私信 提问
v​c​+​+​实​现​s​n​m​p​编​程

首先来阐述几个重要的概念:   1、community (共同体名):如果翻译过来可能会显得难于理解,其实你完全可以把它理解为一个带有权限的登陆账户,这是你访问网络设备的重要凭据,比如你要访问...

nothingfinal
2014/07/02
0
0
M​y​E​c​l​i​p​s​e​ ​8​.​5​ ​注​册​方​法

MyEclipse 8.5 注册方法 1.在使用了老师给的MyEclipse 8.5一段时间之后,会出现这个警告对话框。 2.解决办法:①登陆http://www.lephones.info网站,在Subscriber附近的文本区输入Subscribe...

杨昊亚
2014/07/12
82
0
S​e​r​v​i​c​e​N​o​w​概​述

1概况 SerivceNow是一家领先的基于云服务,实现企业IT运维的自动化提供商。 专注于将企业IT自动化和标准业务流程,改变IT企业与客户之前的关系,加强全球企业的IT内部管理。企业部署我们的服...

YOTOO
2014/04/10
383
0
​​​​​​​为什么Lisp语言如此先进?

(节选自即将出版的《黑客与画家》中译本) 一、 如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。 Python模仿Lisp,甚至把...

平凡之路
2016/07/12
885
2
W​i​n​7​ ​6​4​位​升​级​后​I​E​1​1​打​不​开​的​解​决​方​案

开始-------搜索程序和文件里输入“运行”(打开)--------regedit----------HKEYCURRENTUSERSoftwareMicrosoftInternet ExplorerMain--------右键--------权限-----------高级-------权限-......

cnu2m
2014/07/25
100
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
9分钟前
2
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
10分钟前
1
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
12分钟前
2
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
15分钟前
2
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
15分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部