django 为什么不能在生产用runsnerver启动那个部署,flask为什么不能在生产环境使用app.run部署的精确本质原因?

网上一般人都回答不好,回答的是结果不是原因都是人云亦云的,没有精确到本质原因。

这就和中医不求甚解只能卖弄玄学一样,只有西医能力精确到本质分子结构才能让人信服,所以大家初中就要学现代生物课,为什么不学老祖宗的本草纲目?

 

为什么不能用那个自带的runserver部署,也必须要精确原因呢才行。

 

先看看网上人云亦云的回答。

 

 

 

 

 

这些回答都是说了个寂寞呢,别人想知道原因,你回答的是结果,都是回答说性能更好更稳定,线上一定要用uwsgi来不用自带的runserver。

 

本质原因是uwsgi在配置 多线程可以绕过io阻塞 + 多进程充分利用多核。

 

现在先不要想你是在做一个web服务了,先来看看下面一个简单的函数

 

import time

 

def view_func(x):

     time.sleep(60)

     return x * 10

 

函数即使接受入参x,然后返回结果是入参的10倍。但是函数耗时60秒。

假设100个人每人调用一次这个函数,相当于把这个函数调用哪个了100次,那么总的耗时是6000秒,假设同一秒钟有100人调用函数,那么第一个人需要60每秒后得到结果,第100个打开浏览器调用这个函数的人需要等6000秒后才能得到结果。

第一个人还能忍受,第100个打开浏览器的用户情绪简直是崩溃了,差不多要等2小时得到结果。

 

如果要加快速度,那么利用threadpoolexecutor线程池来运行函数,pool.submit(view_func,x),假设线程池大小是500,开他娘的500线程,别说100人同一秒访问,就是300人同一秒访问,也可以在60秒内给所有人返回函数结果。

uwsgi的配置里面设置线程数量来运行web服务,和python用线程池来运行函数是一个道理,这才是本质啊,说那些稳不稳定这种玄学回答是没有说到本质点子上。

uwsgi除了多线程同时也是叠加多进程,多进程+多线程充分利用io和多核cpu。类似的gevent 和uwsgi也是很相似的功能。一般这些东西都是从配置里面就能看出来了,都是多进程+ 多线程(或者协程)。

不要说那些玄学,说uwsgi是什么c语言写的啊,c语言给django函数加速啊,扯这些有的没的没用,即使是python自带的线程池也能绕过io实现加速,只不过效率没c语言的好,但如果django视图函数耗时是秒级,那么c语言的调度并不会比python的调度快很多了。

 

之所以很多人在开发环境用runserver,自测没发现卡顿,主要是一个是开发自有自己一个人访问,很少瞬间内用浏览器同一秒打开几十个标签,而且开发环境那的数据库数据很少,视图函数本身只需要0.1毫秒就能计算出结果,即使是瞬间打开1万个浏览器标签,也不会感受到django服务的卡盾了。反正就是如果视图函数是0.几毫秒级,例如视图函数什么逻辑都没有直接return "hello",那么不使用uwsgi  gunicorn部署也能支撑瞬间高并发。

 

反正网上回答人云亦云,没说到本质,回答牛头不对马嘴。

 

posted @ 2021-06-12 15:08  北风之神0509  阅读(797)  评论(1编辑  收藏  举报