测试两个接口

# -*- 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. zeroMQ消息传送的是一个固定长度的二进制数据,而TCP是通过字节流,那二进制流和字节流有啥区别?

    1.TCP是面向连接的,它在UDP数据包的基础上增加了重传.流控等一系列机制,封装成基于字节流的传输层通讯协议.使用字节流,应用有点像语音或视频聊天,粒度小到一个字节,双向同时传输,连绵不断. Zer ...

  2. 学习MongoDB(二) Replica Set集群配置

    1.官方网址:https://docs.mongodb.org/manual/tutorial/deploy-replica-set-for-testing/ 2.Replica Set介绍: htt ...

  3. CAS (14) —— CAS 更多用户信息

    CAS (14) -- CAS 更多用户信息 摘要 将更多用户信息写入到service验证返回消息中 版本 tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas ...

  4. Extjs4 页面加载先白屏后显示的bug解决

    通过Extjs MVC结构做好页面后,加载过程中发现,会瞬间白屏,然后呈现extjs界面的问题,当类似页面放置到iframe中时,会显得非常怪异. 可通过下图体验下. 当我单击“意见反馈”菜单,在右侧 ...

  5. dapper支持操作函数和事物

    dapper除了支持基础的CURD.存储过程以外,还支持操作函数和事物. dapper操作函数的代码如下: using Dapper; using System; using System.Colle ...

  6. click只能点击一次

    <select id="s_province" name="s_province" class="s_province">< ...

  7. ubuntu eclipse&JDK

    1. 下载jre,eclipse,cdt 其中jre是java运行环境,eclipse需要先装jre,才可能运行,cdt是在eclipse中运行c\c++程序的插件. 1.1 下载jre 网址是:ja ...

  8. 【转】关于HTTP服务器每个客户端2个连接的限制

    http://www.cnblogs.com/lishenglyx/archive/2010/01/07/1641190.html 这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线 ...

  9. Linux命令_用户和用户组管理

    新增组的命令 groupadd 格式:groupadd [-g GID] groupname 如果不加-g选项,则按照系统默认的gid创建组.跟uid一样,gid也是从1000开始的. 我们也可以如下 ...

  10. Mybatis表关联多对一

    在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...