Python Web服务器(非堵塞,长连接,短连接、epoll)

  • 单进程,单线程怎么做到跳过堵塞?
    可以用 xxx.setblocking(False)    # 来设置套接字为非堵塞的方式
    这样在  xxx.accept() 的时候如果没有数据传入就会产生异常   (可以用try的方式来解决)
  • 短连接就是用三次 ‘握手挥手’ 获得三次数据
    如果是处理一些比较小的数据,就用短连接,客户一连接,就给他数据然后断开连接,腾出资源
  • 长连接就是用一次 ‘握手挥手’ 获得三次数据
    如果处理的是长时间的数据,就用长连接,但会监听客户端的数据,如果在一段时间没有收到客户端的数据,就会断开连接,腾出资源给其他人
  • 访问一个网站,一个网站基本上都有许多图片
    • 如果是短连接,它会先连接,获得网站数据,然后为在数据中得到的每个图片发起一次连接,显示返回的图片数据   
      # 这样会创建多个套接字,然后会创建多个进程、线程、协程来处理套接字
    • 如果是长连接,它会先连接,获得网站数据,但不断开,继续访问每个图片的数据,显示返回的图片数据
      #  但是之前写的程序都会让客户端调用close  本质上还是短连接
    • 短连接传完了就调用close 但是长连接不调用,客户端必须让服务器知道你接受完毕才会重新接受客户端的数据
      因此服务器在给客户端传数据的时候,数据头中有 content-Length: xx 来表示发送了多少的数据。
  • epoll(两个特点)
    • * 内存映射*  一台电脑有应用程序和操作系统两个的各自使用空间,两者是绝对分开的。每次执行都要把信息从应用程序空间拷贝到操作系统空间去执行,但使用单线程非堵塞的话,会创建一个列表,而操作系统是每个程序都执行一点的雨露均沾型,所以如果一个列表太大,而拷贝信息也要时间,那么运行速度会变慢。
      而epoll会创建一个空间,是应用程序和操作系统共用的空间,这样就不要拷贝就能直接得到信息了。(感觉跟Queue队列差不多)
    • 使用的是时间通知(当可以接收的数据到来时,通知可以接收数据的对线来接收)而不是轮询(每个询问一遍:有没有数据要接收)

 

posted @ 2020-03-04 14:40  otome  阅读(387)  评论(0编辑  收藏  举报