uWSGI 是一个(巨大的) C 应用,所以你需要一个 C 编译器(比如 gcc)和python-dev。

把它部署到 HTTP 端口 9090

现在运行 uWSGI 来启动一个会把请求传递给你的 WSGI 应用的 HTTP 服务器/路由器。

uwsgi --http :9090 --wsgi-file foobar.py

添加并发和监控

你想做的第一件事可能就是增加并发(uWSGI 默认启动一个单独的进程和一个单独的线程)。

你可以通过 --processes 选项或者 --threads (或者两个选项都使用)来增加更多的进程或者线程。

uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2

这将会产生 4 个进程(每个进程 2 个线程),一个主进程(当你的进程死掉时会重新 spawn 一个新的)以及 HTTP 路由器(见前面)。

一个重要的任何就是监控。知道发生了什么在生产环境中是极其重要的。stats 子系统允许你 用 JSON 输出 uWSGI 的内部数据:

uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

向你的应用发送几个请求然后 telnet 到 9191 端口,你将得到大量有趣的信息。你可能想要使用 “uwsgitop” (使用pipinstall你就能得到它),这是一个类似 top 的工具,用于监控应用实例。

一般架构:

结论:

  1. 使用execute_from_command_line方式启动django应用时, 会先加载urls, 从而会加载我们写的业务代码(views中的代码); 然后再加载中间件代码. 在应用启动完成时, 所有相关代码都已经被加载入内存。
  2. 使用get_wsgi_application方式启动django应用时, 会先加载中间件代码, 这与1中的是完全相反的。 此时, 我们的业务代码仍然没有被加载, 直到第一个请求过来。 如果我们在代码中, 使用了未加载的代码中的全局变量, 就会出现莫名其妙的bug

RUNSERVR

官方文档解释django自带的server默认是多线程

测试

python3 manage.py runserver 0.0.0.0:8000

django开两个接口,第一个接口sleep(20),另一个接口不做延时处理(大概耗时几毫秒)

先请求第一个接口,紧接着请求第二个接口,第二个接口返回数据,第一个接口20秒之后返回数据

证明django的server是默认多线程

python3 manage.py runserver 0.0.0.0:8000 --nothreading

重复上述步骤

#4 使用 uWSGI 服务器启动 django

#4.1 启动 uWSGI

# 在django项目目录下 Demo工程名

uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py

经过上述的步骤测试,发现在这种情况下启动django项目,uWSGI也是单线程,访问接口需要"排队"

不给uWSGI加进程,uWSGI默认是单进程单线程

#4.2 给uWSGI加进程数

uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2

# processes: 进程数 # processes 和 workers 一样的效果

# threads : 每个进程开的线程数

1

2

3

4

经过测试,接口可以"同时"访问,uWSGI提供多线程

#5 总结关于django的多线程问题

Python因为GIL的存在,在一个进程中,只允许一个线程工作,导致单进程多线程无法利用多核

多进程的线程之间不存在抢GIL的情况,每个进程有一个自己的线程锁,多进程多GIL

单进程多线程的python应用可以实现并发,但是不存在并行

多进程的多处理器的python应用可能存在并行,至于并发还是并行,有操作系统决定,如果分配单处理器处理多进程,那就是并行,如果分配给多处理器那就是并行

Nginx+uWSGI可以实现python高并发

django多线程_Django两种启动方式(runserver和uwsgi)的区别相关推荐

  1. 【Django】项目中调用深度学习模型model.predict()(Django两种启动方式runserver和uwsgi的区别)

    目录 问题 测试 解决方法 Django两种启动方式runserver和uwsgi的区别 问题 部署含有深度学习模型的Django项目的uWSGI.Nginx服务器的时候,所有模块都可以正常运行,也可 ...

  2. 多线程python实现方式_python多线程的两种实现方式(代码教程)

    本篇文章给大家带来的内容是关于python多线程的两种实现方式(代码教程),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 线程是轻量级的进程,进程中可划分出多个线程,线程可独立的调度 ...

  3. android启动服务的生命周期,Android Service的两种启动方式以及生命周期

    Service的两种启动方式: 1.startService 2.bindService 注意: .在Android 5.0之后google出于安全的角度禁止了隐式声明Intent来启动Service ...

  4. service两种启动方式的区别

    service,中文名称是服务,服务是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互,而且还要长期运行的任务. 服务运行不依赖于任何用户界面,即使程序切换到后台,或者 ...

  5. tomcat两种启动方式

    tomcat的两种启动方式,第一种,直接点击bin/startup.bat启动,第二种注册成服务启动 1.通过startup.bat启动 指定jdk:在tomcat/bin/setclasspath. ...

  6. Service的两种启动方式与区别

    Service的启动方式:startService() 和 bindService() startService() public abstract void startService(Intent ...

  7. WIN8 与WIN7的64位及32位 分别对Legacy BIOS+MBR和UEFI+GPT两种启动方式和分区架构下的安装可行性分析

    微软系统.相关产品官方镜像下载:http://msdn.itellyou.cn/  关于MBR.GPT.ESP.MSR.EFI.UEFI和WIN8中SECURE BOOT的基础知识:   1.MBR分 ...

  8. Android中启动一个服务,Android服务的两种启动方式

    前言:Service是Android的四大组件之一,也是可执行的程序.服务是Android中实现程序后台运行的解决方案,非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.Service的启动 ...

  9. (一)Service的生命周期和两种启动方式

    Service 一.概念 Service,也是Android四大组件之一.对照Activity的概念,Service属于后台运行的进程,并不需要界面,可以在后台长期运行,适合做比如播放音乐,下载等任务 ...

最新文章

  1. Google搜索的常用技巧
  2. F# 4.0于全平台发布
  3. hdu5391 Zball in Tina Town
  4. Scala集合实现WordCount单词统计代码
  5. 保存MATLAB中间变量值的方法:保存为txt文件或者mat文件
  6. cygwin 字符显示
  7. linux内核镜像sd卡,【原创】Linux QT镜像的制作--制作SD卡启动盘
  8. [Flex] flex的安全沙箱,你保障了安全的同时也害苦了多少我这样的人那
  9. 《大数据技术原理与应用》林子雨 期末复习重点(总结)
  10. 利用VGA输出音频信号
  11. Justinmind使用教程(5)——Justinmind破解
  12. 网页设计语言html做思维导图,纯css3实现思维导图样式示例
  13. 学计算机智商,IQ最高的十大专业公布,考验你们智商的时刻到了!
  14. Android手机电池不耐用,手机电池用久了不耐用?教你几招让它“起死回生”!
  15. HttpRunner3使用
  16. 判断SDCard是否存在
  17. java基础实战项目一:实现家庭记账本的简易记账功能
  18. dashboard的安装使用
  19. inband与outband
  20. 2021icpc网络赛

热门文章

  1. 基于深度迁移学习进行时间序列分类
  2. 中国计算机学会YOCSEF TDS《专题探索班》,新一代人工智能的基础与前瞻
  3. java瑞格实验2;2020.4.3
  4. CVPR 2021 involution:超越convolution和self-attention的神经网络新算子
  5. Struts2-向值栈中存放数据
  6. JavaScript + Tampermonkey——易班优课YOOC课群在线测试自动答题解决方案(十七)复合型解决方案油猴脚本
  7. Best Cow Line
  8. linux scp密码参数,使用scp命令安全地传输带有参数的文件
  9. php连接数据库封装函数,PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】...
  10. 关于MVC框架和spring