網絡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是不須要阻塞的
相關文章
相關標籤/搜索