使用postman进行高压测试,查完官方文档后确定他是串行运行的,等待一个post有响应结果后在发送下一个post请求,但我觉得还可以了,主要是测试连续请求会不会顺序打乱,程序崩溃。
Flask 默认是单进程,单线程阻塞的任务模式,在项目上线的时候可以通过nginx+gunicorn 的方式部署flask任务。
但是在开发的过程中如果想通过延迟的方式测试高并发怎么实现呢,其实非常简单,
app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。
1.threaded : 多线程支持,默认为False,即不开启多线程;
2.processes:进程数量,默认为1.
开启方式:
if __name__ == '__main__':
app.run(threaded=True)
# app.run(processes=True)
注意:多进程或多线程只能选择一个,不能同时开启。
processes=num 使用报错了,ValueError: cannot have a multithreaded and multi process server,将num改为True就可以使用flask框架的多进程了。
进程其实是资源的分配的单位,包括代码、内存、CPU等等,多进程类似程序的多开,比如qq的多开。
下图解释了多进程工作的原理,在主进程下,子进程1和子进程2分别复制了主进程的代码以及资源,而子进程1则只运行test1这个函数,子进程2则只运行test2这个函数,进程之间的全局变量互不影响,对资源的开销比较大。当主进程结束后,所有的子进程全部结束,而子进程之间互不影响。
在一个进程中我们也可以使用多任务,这就是线程,线程其实是操作系统资源调度的单位。多线程可以共享全局变量。
多线程并不会复制主进程的代码和资源,而是共享全局变量,相比多进程来说,资源开销更加小。在同一时间,子线程1和子线程2同时运行,实现多任务,而他们会共享全局变量。
例如设置一个全局变量,子线程让他+1后打印,另一个子线程打印也是+1后的数值。
如果你对自己的硬件资源很自信,那么就选择多进程。因为多进程占用资源比较多,因为其全局变量不共享,内存中存储多个相同变量。
但如果你的代码逻辑很复杂,一些变量产生了问题,那么就不要用多线程了,宁愿使用多一些资源也不要产生故障。
nohup python run.py >log.txt 2>&1 &
这样将.py文件更换成我们自己的就可以了。这里仅仅是后台运行,但是我们如果希望确保重启和服务器变动之后也保持运行,则需要添加到开机启动项中。
如果我们在服务器中运行某些脚本且设定需要一直运行状态,但是如果因为我们自己或者服务器不稳定导致重启,会导致工具无法运行。比如老蒋昨天在运行Python脚本的时候,用nohup虽然可以后台自动运行,但是如果服务器被重启又导致页面无法访问。
yum install -y lsof //安装lsof
sudo apt-get install lsof //安装lsof
sudo lsof -i:端口号 //查找对应的进程号
sudo kill -9 进程号 //杀死对应的进程
flask好像在高并发上效果不太好,容易崩。建议使用gunicorn,并发大一点。
pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo fuser -v /dev/nvidia*
或者
pip install gpustat -i https://pypi.tuna.tsinghua.edu.cn/simple
然后输入gpustat