python tornado异步性能测试
测试两个接口
# -*- 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秒,提高并发需要设置几十个进程几百个线程来弥补,资源消耗很大,还是需要使用异步。
。
反对极端面向过程编程思维方式,喜欢面向对象和设计模式的解读,喜欢对比极端面向过程编程和oop编程消耗代码代码行数的区别和原因。致力于使用oop和36种设计模式写出最高可复用的框架级代码和使用最少的代码行数完成任务,致力于使用oop和设计模式来使部分代码减少90%行,使绝大部分py文件最低减少50%-80%行的写法。