Django之多路复用

  • 基础
    •      IO模型有5种
        •     
    •   对于一个套接字上的输入操作,1)等待网络中的数据到达,将数据复制到内核的某个缓冲区;2)把数据从内核缓冲区复制到进程缓冲区
    •         阻塞I/O和非阻塞I/O

         非阻塞I/O,不停在调用CPU(这种方式称之为轮询)但是在做无用功,极大浪费

  •  传统模型中,server对于每个被动Socket连接都会新开一个线程处理,这样在大量并发时,在内存,切换线程上都造成很大麻烦。
  •     I/O模型中,sever会开一个线程(函数select)去监听所有的连接的Socket,当监听的Socket有事件响应时,返回就绪的socket描述符
    •   select :
        • 描述符,可读描述符集合,可写描述符集合,异常描述符集合,时间
        • 四个宏  :1)从描述符集中移除指定描述符 ;2)检查指定描述符是否存在描述符集中
            • 3)向描述符集中添加描述符;4)清空描述符集      

      

    •   事件响应:1)新的连接;2)数据到达;3)FIN到达;4)RST到达

      

    •     ready列表:select返回的就绪描述符集 
      •   Django中的select
         1     def select(self, timeout=None):
         2         timeout = None if timeout is None else max(timeout, 0)
         3         ready = []
         4         try:
         5             r, w, _ = self._select(self._readers, self._writers, [], timeout)
         6         except InterruptedError:
         7             return ready
         8         r = set(r)
         9         w = set(w)
        10         for fd in r | w:
        11             events = 0
        12             if fd in r:
        13                 events |= EVENT_READ
        14             if fd in w:
        15                 events |= EVENT_WRITE
        16 
        17             key = self._key_from_fd(fd)
        18             if key:
        19                 ready.append((key, events & key.events))
        20         return ready
        21 
        22 
        23 #返回的ready[(SelectorKey(fileobj=<django.core.servers.basehttp.WSGIServer object at 0x03489610>, fd=548, events=1, data=None), 1)]
        select函数
         

猜你喜欢

转载自www.cnblogs.com/zengmu/p/12923244.html
今日推荐