zoukankan      html  css  js  c++  java
  • 网络IO模型 非阻塞IO模型

    网络IO模型 非阻塞IO模型

    • 同步

      • 一件事做完后再做另一件事情
    • 异步

      • 同时做多件事情
      • 相对论 多线程 多进程 协程 异步的程序
        • 宏观角度:异步 并发聊天
    • 阻塞IO

      • 阻塞IO的问题
        • 一旦阻塞就不能做其他事情了
      • 原生socket,默认阻塞IO
    • 非阻塞IO模型

      • 非阻塞IO问题

        • 给CPU造成了很大的负担
      • 原生socket setblocking(False)不推荐使用

        • from socket import *
          import time
          s=socket(AF_INET,SOCK_STREAM)
          s.bind(('127.0.0.1',8080))
          s.listen(5)
          s.setblocking(False) #设置socket的接口为非阻塞
          conn_l=[]
          del_l=[]
          while True:
              try:
                  conn,addr=s.accept()
                  conn_l.append(conn)
              except BlockingIOError:
                  print(conn_l)
                  for conn in conn_l:
                      try:
                          data=conn.recv(1024)
                          if not data:
                              del_l.append(conn)
                              continue
                          conn.send(data.upper())
                      except BlockingIOError:
                          pass
                      except ConnectionResetError:
                          del_l.append(conn)
          
                  for conn in del_l:
                      conn_l.remove(conn)
                      conn.close()
                  del_l=[]
          
          #客户端
          from socket import *
          c=socket(AF_INET,SOCK_STREAM)
          c.connect(('127.0.0.1',8080))
          
          while True:
              msg=input('>>: ')
              if not msg:continue
              c.send(msg.encode('utf-8'))
              data=c.recv(1024)
              print(data.decode('utf-8'))
          
      • 永远在就绪和运行之间切换,虽然能够最大限制的利用CPU,但是不排除过度利用的现象

    • IO多路复用

      • 利用一个操作系统提供给你的代理机制,来帮助你监听网络IO对象的读写时间
    • 异步IO 最好

      • 等待数据阶段和拷贝数据阶段都不需要用户处理,所有的操作都由操作系统替你完成,拷贝数据阶段,只有异步IO是不需要阻塞的
  • 相关阅读:
    vue动态设置页面title方法
    laravel 只有/login路由403,如何解决
    vue-cli中使用rem,vue自适应
    Vuex的全面用法总结
    template or render function not defined.
    Laravel Mix编译前端资源
    laravel学习:模块化caffeinated
    laravel学习:php写一个简单的ioc服务管理容器
    Aspose Cells dll 实现数据简单下载
    sessionStorage 的使用
  • 原文地址:https://www.cnblogs.com/yuncong/p/9752410.html
Copyright © 2011-2022 走看看