zoukankan      html  css  js  c++  java
  • 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部署也能支撑瞬间高并发。

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

    反对极端面向过程编程思维方式,喜欢面向对象和设计模式的解读,喜欢对比极端面向过程编程和oop编程消耗代码代码行数的区别和原因。致力于使用oop和36种设计模式写出最高可复用的框架级代码和使用最少的代码行数完成任务,致力于使用oop和设计模式来使部分代码减少90%行,使绝大部分py文件最低减少50%-80%行的写法。
  • 相关阅读:
    mysql 注意事项 PreparedStatement 对比 statement
    Dbutils commons-dbutils-1.3
    C3P0 mysql 5.7
    servlet-应用mysql-1
    javabean 用integer 而不是int
    servlet-1
    servlet 路径 编码 问题
    mac tomcat 9.0
    case end 的用法
    自定义抛出异常
  • 原文地址:https://www.cnblogs.com/ydf0509/p/14878314.html
Copyright © 2011-2022 走看看