网络IO模型 非阻塞IO模型

网络IO模型 非阻塞IO模型

  • 同步python

    • 一件事作完后再作另外一件事情
  • 异步网络

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

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

    • 非阻塞IO问题app

      • 给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,可是不排除过分利用的现象socket

  • IO多路复用操作系统

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

    • 等待数据阶段和拷贝数据阶段都不须要用户处理,全部的操做都由操做系统替你完成,拷贝数据阶段,只有异步IO是不须要阻塞的
相关文章
相关标签/搜索