zoukankan      html  css  js  c++  java
  • 【代码运行服务】并发运行冲突

    代码运行服务稳定的使用了一段时间,但是有用户反馈测试计划的断言有时候会出现断言失败。但是单独执行用例不会出现这样的情况

    啥原因捏?
    定位时发现执行了关键字函数断言,确实在测试计划执行时概率性的断言失败,返回None或者500 error

    查看该关键字函数的代码,若非异常,该函数应返回True 或者 False,但现在概率性出现返回None或者500 error,而且仅在测试计划执行时出现

    那是否是因为并发执行导致该问题的出现?

    首先看看启动参数
    windows环境

    app.run(host='0.0.0.0', port=5001, debug=True, threaded=True)
    

    linux环境

    app.run(host='0.0.0.0', port=5001, debug=False, processes=20)
    

    在本地mac电脑上配置启动参数为app.run(host='0.0.0.0', port=5001, debug=False, processes=20) 报错

      File "/Users/lluozh/work/git/SWQA_API/venv/lib/python3.7/site-packages/werkzeug/serving.py", line 803, in make_server
        raise ValueError("cannot have a multithreaded and multi process server.")
    ValueError: cannot have a multithreaded and multi process server.
    

    网上搜索原因

    之前启动项目一直起不来,报cannot have a multithreaded and multi process server.的错误,查看了很多资料,都是说 flask 的加载过程,一直没有找到解决方案,后来发现是版本问题
    pip install flask 的版本是 1.0.2 ,将其卸载,换成 0.11.1版本后就可以了,可能是版本更新后接口或配置参数方面有差异,暂时还没找到原因

    修改后在该项目启动仍然失败,好吧,不纠结这个
    在windows环境将配置修改成app.run(host='0.0.0.0', port=5001, debug=True, threaded=False) 即单线程单进程运行
    并发运行时按照顺序执行,并未出现异常

    那是否是因为多线程或多进程flask处理都会有问题?
    其他方式是否也可以提高并发的性能?
    有推荐另外一种方式,即使用genvent做协程,解决高并发的问题

    from genvent.wsgi import  WSGIServer
    from genvent import monkey
    
    monkey.patch_all()
    app = Flask(__name__)
    app.config.from_object(config)
    api = Api(app)
    
    db = DBInfo()
    # db_old = DBInfo_old()
    

    然后通过这种方式包装WSGIServer((address,port), app).serve_forever()
    通过python code.py 的方法,来启动服务
    但是这样需要调整和影响的部分比较多,是否并不是因为多线程或多进程的处理,而是代码服务本身的处理逻辑的问题?

    修改成多线程多次运行时,发现概率出现找不到代码模块
    在这里插入图片描述
    当前生成代码文件名

    def mk_file_name(self):
        """
        生成文件名称
        """
        # return '%s_%d' % (self.fun_name,int(time.time() * 1000))
    

    是否因为并发运行时,不同线程或进程生成时间戳概率性出现一样导致?

    修改生成文件名的方式

    import uuid
    def mk_file_name(self):
        """
        生成文件名称
        """
        return '%s_%s' % (self.fun_name, uuid.uuid1())
    

    并发测试看是否ok,发现多线程和多进程的启动方式均没有问题,那到底哪种启动方式的性能更好呢?
    服务启动两个实例,请求参数均一致

    启动参数processes=20在这里插入图片描述
    启动参数threaded=True
    在这里插入图片描述

    可以看出processes=20 性能更优

  • 相关阅读:
    快速读取txt文档
    ASP.NET中缓存非SQLServer数据库数据
    查看linq to sql 生成的sql 语句
    跟树有关的数据结构学习系列之概览
    Linux安装软件包时的“依赖关系树”算法(C#)
    Go调度器介绍和容易忽视的问题
    搞懂Go垃圾回收
    Go“一个包含nil指针的接口不是nil接口”踩坑
    Go slice:切片的“陷阱”和本质
    C#调用ODBC连接SQL Server数据库的存储过程
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12533565.html
Copyright © 2011-2022 走看看