• Django之多路复用(待补充)


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

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

    •  传统模型中,server对于每个被动Socket连接都会新开一个线程处理,这样在大量并发时,在内存,切换线程上都造成很大麻烦。
    •     I/O模型中,sever会开一个线程(函数select)去监听所有的连接的Socket,当监听的Socket有事件响应时,返回就绪的socket描述符
        • select :
          • nfds:文件描述符的值+1  (rea:标准输入丶标准输出丶异常被定义为描述符0,1,2,服务端开的监听描述符就被定义为3,此时如有客户端来请求连接并成功就会被定义为4.所以nfds是fdmax+1的原因是因为描述符是从0开始) 最大值是1024 因为bitmap最大位就是1024 
          • 描述符,可读描述符集合,可写描述符集合,异常描述符集合
          • 四个宏  :1)从描述符集中移除指定描述符 ;2)检查指定描述符是否存在描述符集中
              • 3)向描述符集中添加描述符;4)清空描述符集      

                    

          • 事件响应:1)新的连接;2)数据到达;3)FIN到达;4)RST到达
            • 调用select时,select会将fds从用户态拷贝到内核态,在内核态内对bitmap进行遍历置位,当有事件发生,扫描fds进行bitmap置位

                                

                                                    

        • epoll 模型 (挖坑 代补充)
          •   epoll_create()     创建一个文件描述符集,内部维护了红黑树和就绪列表
          •        epoll_ctl()    对红黑树上的fd进行响应事件操作,增删查→当有事件响应发生,在红黑树进行响应的增删查,并通过回调函数将就绪的fd移到就绪列表里面
          •        epoll_wait()  监听就绪列表里面的fd对象→运行该函数时,会返回就绪的事件数,然后在就绪列表顺序找到相应的fd数量就可以

      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函数

        q:服务器运行后对ready列表进行监听,感觉像是select和epoll的杂糅

  • 相关阅读:
    dedecms文章标题是在哪个数据库表?要批量替换关键词
    dedecms首页调用的简介一直修改不了是自动文章摘要在作怪
    如何进行微信营销?玩转微信公众平台营销理论手册
    用了那么久居然没发现firefox快捷键有如此多
    保护隐私:清除cookie、禁用cookie确保安全【分享给身边的朋友吧】
    如何更改firefox默认搜索引擎?一步搞定!
    微信红包中使用的技术:AA收款+随机算法
    马年添加一下马蹄印记统计(网站统计)
    今天上完就放假了,马年见
    三种dedecms调用相关文章的方法
  • 原文地址:https://www.cnblogs.com/zengmu/p/12923244.html
Copyright © 2020-2023  润新知