【代码运行服务】并发运行冲突

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

啥原因捏?
定位时发现执行了关键字函数断言,确实在测试计划执行时概率性的断言失败,返回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 性能更优

posted @ 2020-01-06 09:00  guanqinghua  阅读(132)  评论(0编辑  收藏  举报