Flask多进程与多线程的区别

Jasmine

发布日期: 2021-08-11 09:42:46 浏览量: 362
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

Flask 默认是单进程,单线程阻塞的任务模式,在项目上线的时候可以通过 nginx+gunicorn 的方式部署 flask 任务。

但是在开发的过程中如果想通过延迟的方式测试高并发怎么实现呢,其实非常简单。app.run() 中可以接受两个参数,分别是 threaded 和 processes,用于开启线程支持和进程支持。

  • threaded:多线程支持,默认为 False,即不开启多线程

  • processes:进程数量,默认为 1

开启方式:

  1. if __name__ == '__main__':
  2. app.run(threaded=True)
  3. # 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 后的数值。

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

如果你对自己的硬件资源很自信,那么就选择多进程。因为多进程占用资源比较多,因为其全局变量不共享,内存中存储多个相同变量。

如果你的代码逻辑很复杂,一些变量产生了问题,那么就不要用多线程了,宁愿使用多一些资源也不要产生故障。

上传的附件

发送私信

当你成功时,谁还在乎你的过去

13
文章数
13
评论数
最近文章
eject