zoukankan      html  css  js  c++  java
  • uWSGI

          uWSGI是实现了WSGIuwsgi的一个web serverWSGI是一种规范。要实现WSGI协议,必须同时实现web serverweb applicationweb serveruwsgi提供,app很多pythonweb框架都支持,比如djangoflask等,基本模型如下。

            uWSGI可以启动多个进程,进程里面可以启动多个线程来服务。进程分为主进程和worker进程,worker里面可以有多个线程。执行启动uwsgi启动主进程,主进程进行初始化并加载app配置,此时会先forkworker进程,但是并未开始accpet消息,等初始化完成才会真正开始acceptmaster用来管理worker进程以及一些定时或者事件触发任务。worker部分负责循环接收(accept)请求。在启动woker时可以根据--threads参数指定要产生的线程个数,否则只在当前进程启动一个线程,这些线程循环接收请求并处理。uWSGI在消息处理方面和nginx很像,有一个互斥锁保证顺序accept消息,但和nginx不同,nginx采用的是异步非阻塞模式处理请求,而uWSGI每个worker以线程方式接收请求,如果使用协程则需要配合gevent,所以nginx可以处理同时处理多个请求,而uWSGI则只能同时处理一个,下面看下uWSGIDjango的交互过程。

    1wsgiweb server参数python化,封装为request对象传递给apllication命名的func对象并接受其传出的response参数,这个applicationwsgi.py里:

    2、加载django的配置,LOGGINGINSTALL_APP等,并调用每个app下的AppConfig里的ready函数完成初始化:

    调用ready函数:

    3、初始化WSGIHandler,加载中间件,返回一个WSGIHandler对象给wsgi,入参是environstart_response

    4、返回后,配置加载完成,uwsgi认为django已经准备好接收请求了,开始启动worker接收消息了。

    5、当收到消息,uwsgi调用WSGIHandler,先解析environ,获取webserver带给我们的信息:

    6、准备获取response,先将请求逐个用中间件进行处理:

     

    7、获取urlconf,并解析request里的参数,然后从url里匹配对应的url

    8、获取对应的view对象,这里这个对象是restframework实现的,并传入参数:

    9、那我们获取到的view对象是怎么来的呢?我们每个url后都会跟一个***.as_view(),这个as_view返回一个view的回调函数,允许接受request, *args, **kwargs

    10django拿到这个view并传入参数,view会调用dispatch依靠request.method将消息分发给我们定义的viewGET,PUT,POST等等方法:

     

    11、修改start_response并返回responsewsgi

  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/small-office/p/9767023.html
Copyright © 2011-2022 走看看