flask 多进程/多线程 解决高并发问题

1、简介:

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框架的多进程了。

2、多进程和多线程的对比

2.1多进程(processes)

进程其实是资源的分配的单位,包括代码、内存、CPU等等,多进程类似程序的多开,比如qq的多开。

下图解释了多进程工作的原理,在主进程下,子进程1和子进程2分别复制了主进程的代码以及资源,而子进程1则只运行test1这个函数,子进程2则只运行test2这个函数,进程之间的全局变量互不影响对资源的开销比较大。当主进程结束后,所有的子进程全部结束,而子进程之间互不影响。
在这里插入图片描述

2.2、多线程

在一个进程中我们也可以使用多任务,这就是线程,线程其实是操作系统资源调度的单位。多线程可以共享全局变量。

多线程并不会复制主进程的代码和资源,而是共享全局变量,相比多进程来说,资源开销更加小。在同一时间,子线程1和子线程2同时运行,实现多任务,而他们会共享全局变量
例如设置一个全局变量,子线程让他+1后打印,另一个子线程打印也是+1后的数值。

2.3多线程和多进程的选择使用

如果你对自己的硬件资源很自信,那么就选择多进程。因为多进程占用资源比较多,因为其全局变量不共享,内存中存储多个相同变量。
但如果你的代码逻辑很复杂,一些变量产生了问题,那么就不要用多线程了,宁愿使用多一些资源也不要产生故障。

3.flask 后台运行

nohup python run.py >log.txt 2>&1 &

将.py文件更换成我们自己的就可以了。这里仅仅是后台运行,但是我们如果希望确保重启和服务器变动之后也保持运行,则需要添加到开机启动项中。
如果我们在服务器中运行某些脚本且设定需要一直运行状态,但是如果因为我们自己或者服务器不稳定导致重启,会导致工具无法运行。

Linux查看并杀死被占用的端口:

yum install -y lsof //安装lsof
sudo apt-get install lsof    //安装lsof
sudo lsof -i:端口号      //查找对应的进程号
sudo kill -9 进程号      //杀死对应的进程

flask好像在高并发上效果不太好,容易崩。建议使用gunicorn部署flask,并发大一点

清华源 + pip下载速度加快

pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple

Linux查看占用GPU的进程

sudo fuser -v /dev/nvidia*

或者

pip install gpustat -i https://pypi.tuna.tsinghua.edu.cn/simple

然后输入gpustat
在这里插入图片描述

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值