测试两个接口

# -*- coding:utf-8 -*-

import time
import tornado.web
import tornado.gen
import tornado.ioloop
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor class SyncHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
time.sleep(5) # sleep用来简单指代某个耗时的io操作
self.write("同步的Hello World") class AsyncHandler(tornado.web.RequestHandler):
executor = ThreadPoolExecutor(5) @tornado.gen.coroutine
def get(self):
resp = yield self.sleep_for_result()
self.write(resp) @run_on_executor
def sleep_for_result(self):
time.sleep(5)
return '异步的Hello World' application = tornado.web.Application([
(r'/sync', SyncHandler),
(r'/async', AsyncHandler),
]) if __name__ == "__main__":
from tornado.options import options, define define("port", default=8080, help="跑在8080", type=int) http_server = tornado.httpserver.HTTPServer(application)
http_server.bind(options.port)
http_server.start(1) # 进程数量
tornado.ioloop.IOLoop.instance().start()

启动tornado服务。

这里不使用ab测试,使用更灵活的代码线程池测试性能,使用线程池并发方式请求接口

#coding=utf8
import requests
import time
from tomorrow import threads @threads(10)
def test_sync():
print requests.get('http://127.0.0.1:8080/sync').content + ' ' + time.strftime('%H:%M:%S') @threads(10)
def test_async():
print requests.get('http://127.0.0.1:8080/async').content + ' ' + time.strftime('%H:%M:%S') [test_sync() for i in range(100)] #[test_async() for i in range(100)]

同步方式测试如下:

看以看到,10线程请求同步接口时候,是每隔5秒才能领处理完成一个请求。程序中设置的tornado进程是1,如果把tornado服务的进程数量提高为4,每5秒也能处理4个同步请求。

异步方式测试如下:

看以看到,10线程请求异步接口时候,是每隔5秒能处理5个请求,因为代码中设置的ThreadPoolExecutor(5)数量是5。如果设置为8,那么每5秒可以处理8个请求。

在做联通 央行征信基于用户授权的登录系统时候,需要校验用户提交的账号密码验证码,加上使用代理ip时间很不稳定,校验用户提交的账号密码是否能够登录三方网站时候需要大量时间,就需要使用tornado这种异步方式了,不然用户提交账号密码后需要很长时间才能得到反馈,用户体验就很糟糕。

如果使用django的,使用自带服务,每5秒能处理1个请求,其他的请求都必须等待上一个请求结束,才能被处理。

但django使用uwsgi部署,不会像自带服务表现这么差,使用uwsgi部署时候一般都会设置进程数量和线程数量,部署后每5秒能处理更多的请求。但是如果接口耗时100秒,提高并发需要设置几十个进程几百个线程来弥补,资源消耗很大,还是需要使用异步。

python tornado异步性能测试的更多相关文章

  1. Python Web框架 tornado 异步原理

    Python Web框架 tornado 异步原理 参考:http://www.jb51.net/article/64747.htm 待整理

  2. Python web框架 Tornado异步非阻塞

    Python web框架 Tornado异步非阻塞   异步非阻塞 阻塞式:(适用于所有框架,Django,Flask,Tornado,Bottle) 一个请求到来未处理完成,后续一直等待 解决方案: ...

  3. tornado异步请求的理解(转)

    tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...

  4. Python开源异步并发框架

    Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·” (Open Source Technology Conference ,简称OSTC ...

  5. 使用Tornado异步接入第三方(支付宝)支付

    目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...

  6. Tornado异步非阻塞的使用以及原理

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...

  7. (转)Python黑魔法 --- 异步IO( asyncio) 协程

    转自:http://www.jianshu.com/p/b5e347b3a17c?from=timeline Python黑魔法 --- 异步IO( asyncio) 协程 作者 人世间 关注 201 ...

  8. Tornado异步(2)

    Tornado异步 因为epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求. 1. tornado.httpclient.Async ...

  9. Python Tornado框架(TCP层)

    Tornado在TCP层里的工作机制 上一节是关于应用层的协议 HTTP,它依赖于传输层协议 TCP,例如服务器是如何绑定端口的?HTTP 服务器的 handle_stream 是在什么时候被调用的呢 ...

随机推荐

  1. 代码备忘, TODO宏实现

    代码备忘, TODO宏实现 我们平时在开发过程中, 往往并非憋足气一股脑敲完所有代码.每一个模块, 每一个函数的实现总有个先后顺序. 又或者哪个部分须要做调整, 改动- 所以, 我们须要有一个东西, ...

  2. 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。

    做过很多winform项目,都为winform控件头疼不已.想实现一些漂亮的样子总是很难.我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标.那么在实现居中效果就会很 ...

  3. Spring Boot 上传文件 获取项目根路径 物理地址 resttemplate上传文件

    springboot部署之后无法获取项目目录的问题: 之前看到网上有提问在开发一个springboot的项目时,在项目部署的时候遇到一个问题:就是我将项目导出为jar包,然后用java -jar 运行 ...

  4. 【Java集合源码剖析】Hashtable源码剖析

    转载出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一 ...

  5. MFC宏

    1,DECLARE_MESSAGE_MAP:在头文件中声明源文件中所含有的消息映射 2,BEGIN_MESSAGE_MAP:标记源文件消息映射的开始 3,END_MESSAGE_MA:标记源文件消息映 ...

  6. Eclipse启动都会Error when loading the SDK

    http://jingyan.baidu.com/article/aa6a2c14fb54190d4c19c480.html

  7. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  8. 为已经存在的本地项目添加git,以及从远程仓库拉取代码并切换远程分支

    前提:先去gitlab或github网站上创建一个新项目,完毕后记得添加.ignore: 1.打开终端​,cd到已存在项目的目录 ​​​2.输入以下命令行,初始化一个本地仓库: ​git init 3 ...

  9. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  10. Linux 下如何处理包含空格和特殊字符的文件名

    Linux 下如何处理包含空格和特殊字符的文件名 作者: Avishek Kumar 译者: LCTT zpl1025 | 2015-07-08 07:47   评论: 12 收藏: 9 分享: 1 ...