理論方法
基於IO多路復用,windows中使用select實現,linux中使用select,pool,epoll實現。
windows中使用select,最多能監聽1024個文件句柄,使用輪詢檢測;
Linux中使用select最多能監聽1024個文件句柄,使用輪詢檢測;pool,監聽個數不限制;epoll使用邊緣觸發,回調通知
IO多路復用-擴展知識
官方定義:幫助開發者監聽多個IO句柄發生變化,用於幫助我們監聽多個socket是否發生變化(連接服務器的socket,和發送消息的socket)
為什么使用IO多路復用:在單線程中,由於我們使用服務端與多個客戶端收發消息時,由於python的代碼是由上往下執行的,因此當服務端和第一個客戶端收發消息時,服務端會處於accept這個狀態,這樣會造成等待,第二個客戶端肯定不能和服務端進行交互,為了解決這個問題,引出了IO多路復用。
代碼實現
import socket import select #可以連接很多個用戶 sk1=socket.socket() sk2=socket.socket() sk1.bind(('127.0.0.1',8001)) sk2.bind(('127.0.0.1',8002)) while True: rlist,w,e=select,select([sk1,conn1,conn2],[],5) for sk in rlist: if sk==sk1: # 服務端socket發生變化,新用戶來連接 conn,addr=sk.accept() conn.send('hello') else: # 客戶端socket發生變化,老用戶發來了消息 data=sk.recv()