zoukankan      html  css  js  c++  java
  • 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秒,提高并发需要设置几十个进程几百个线程来弥补,资源消耗很大,还是需要使用异步。

     

  • 相关阅读:
    NodeJs 实现 WebSocket 即时通讯(版本二)
    (JavaScript) 时间转为几天前、几小时前、几分钟前
    (IDEA) 从数据库快速生成Spring Data JPA实体类
    (IDEA) 设置编码统一为UTF-8
    ElasticSearch 中文分词插件ik 的使用
    Logstash 安装及简单实用(同步MySql数据到Elasticsearch)(Windows)
    Docker在Linux上 基本使用
    vue设置页面标题
    HTML5实战与剖析之字符集属性(charset和defaultCharset)
    asp.net传多个值到其它页面的方法
  • 原文地址:https://www.cnblogs.com/ydf0509/p/8972901.html
Copyright © 2011-2022 走看看