• flask与fastapi性能测试


    flask与fastapi性能测试

    背景

    sy项目通过MQ接受业务系统的业务数据,通过运行开发者开发的python脚本执行业务系统与财务系统数据的一致性校验。
    sy系统需要每天运行大量的python脚本。目前使用falsk日运行6W+次python脚本,由于性能存在瓶颈,需要引入
    新的fastapi框架,来解决cpu、内存性能压榨不够及目前的性能瓶颈。本文目标给出两者的性能测试报告。
    给出选择哪个框架的性能数据支撑。

    apache ab介绍

    apache ab性能测试

    安装

        yum -y install httpd-tools
    
    • 1

    部分参数说明

    -n  执行的请求总数
    
    -c 并发数, 同时执行的数量, c不能大于n
    -p post请求指定的文件
    -T header Content-type值,默认为 'text/plain'
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试get请求

    ab -c 10  http://127.0.0.1:8081/cppla
    
    • 1

    测试post请求

    ab -n 100 -c 10 -T 'application/json' -p httpjson.txt  http://127.0.0.1:8081/cppla1  
    
    // httpjson.txt的内容
    {"recordId": 123}
    
    • 1
    • 2
    • 3
    • 4

    测试计划

    模拟真实每次请求调用脚本,分别对每一个数量级的请求量进行测试。

    请求总数每次并发数每次并发数每次并发数
    100101001000
    1000101001000
    10000101001000
    20000101001000
    30000101001000
    40000101001000
    50000101001000
    60000101001000
    80000101001000

    测试代码

    处理post请求,延时3s返回结果。flask启动20个进程。fastapi启动一个进程。

    ## flask 代码
    # coding: utf-8
    from gevent import monkey
    from gevent.pywsgi import WSGIServer
    import requests
    
    import datetime
    import os
    from multiprocessing import cpu_count, Process
    from flask import Flask, jsonify,request
    import json
    import traceback
    
    import importlib
    from loguru import logger
    import time
    
    
    app = Flask(__name__)
    
    # 执行run方法
    @app.route("/cppla1", methods=['POST', 'GET'])
    def cppla1():
        data = request.json
        time.sleep(3)
        return data
    # 启动监听ip、端口
    def run(MULTI_PROCESS):
        if MULTI_PROCESS == False:
            WSGIServer(('0.0.0.0', 8081), app).serve_forever()
        else:
            mulserver = WSGIServer(('0.0.0.0', 8081), app)
            mulserver.start()
    
            def server_forever():
                mulserver.start_accepting()
                mulserver._stop_event.wait()
    
    
           # for i in range(cpu_count()):
            for i in range(20):
                logger.info('启动进程第几个:{}', i)
                p = Process(target=server_forever)
                p.start()
    
    if __name__ == "__main__":
        # 单进程 + 协程
        # run(False)
        # 多进程 + 协程
        log_init()
        run(True)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    ## fastapi
    # coding: utf-8
    
    # https://www.javazhiyin.com/80750.html
    # import web framework
    from fastapi import FastAPI
    from fastapi.encoders import jsonable_encoder
    from fastapi.responses import JSONResponse
    
    
    # import base lib
    import datetime
    import os
    import requests
    import json
    import traceback
    import importlib
    from loguru import logger
    import time
    
    app = FastAPI()
    
    @app.post("/cppla1")
    def function_benchmark(data:dict):
        time.sleep(3)
        return {"item": data}
    
    # 启动监听ip、端口
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run(app, host="0.0.0.0", port=8081)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    测试结果

    框架类型请求总数每次并发数耗时(s)每次并发数耗时(s)每次并发数耗时(s)
    fastapi1001033.11910012.1481000ab命令不支持
    flask1001045.08810081.1061000ab命令不支持
    fastapi100010304.05710078.283100078.631
    flask100010327.472100198.2731000303.442
    fastapi1000010x100754.2961000757.719
    flask1000010x1001550.11910001970.427
    fastapi2000010x100x1000x
    flask2000010x100x1000x
    fastapi3000010x100x1000x
    flask3000010x100x1000x
    fastapi4000010x100x1000x
    flask4000010x100x1000x
    fastapi5000010x100x1000x
    flask5000010x100x1000x
    fastapi6000010x100x1000x
    flask6000010x100x1000x
    fastapi8000010x100x1000x
    flask8000010x100x1000x

    结论

    fastapi是flask性能的3倍,推荐使用fastap。

  • 相关阅读:
    Bean作用域和生命周期
    【广州华锐互动】全屋智能家电VR虚拟仿真演示系统
    软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?
    HK32F030MF4P6 实现PAout(xx)/PAin(xx)
    GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别
    onlyOfice取消上传文件大小的限制
    JavaScript 之 常用迭代方法forEach、filter()、map()、reduce()
    Halcon Image相关算子(二)
    开源免费的流程设计器如何选型
    再立云计算“昆仑”,联想混合云Lenovo xCloud凭什么?
  • 原文地址:https://blog.csdn.net/u013565163/article/details/128048213