网络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是不需要阻塞的
posted @ 2018-10-08 08:24  云丛  阅读(127)  评论(0编辑  收藏  举报