代码运行服务稳定的使用了一段时间,但是有用户反馈测试计划的断言有时候会出现断言失败。但是单独执行用例不会出现这样的情况
啥原因捏?
定位时发现执行了关键字函数断言,确实在测试计划执行时概率性的断言失败,返回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
性能更优