python select 实现IO异步
import select import socket import queue server = socket.socket() server.bind(('localhost',9000)) server.listen(1000) #设置为非阻塞,导致revc没数据的时候不阻塞 server.setblocking(0) msg_div = {} inputs = [server,] outputs= [] while True: readable,writable,excepional = select.select(inputs,outputs,inputs) for r in readable: #代表来了一个新连接 if r is server: conn,addr = server.accept() print(conn,addr) #因为这个新建立的连接还没发数据过来,而且我们将socket 设置为非阻塞,现在接收会报错 #所以需要让select 检查conn inputs.append(conn) #初始化一个队列,后边存储要返回给客户端的数据 msg_dic=[conn]=queue.Queue() else: data = r.recv(1024) print("收到数据:",data) msg_dic[r].put(data) #放入返回的连接队列里 outputs.append(r) # r.send(data) #要返回给客户端的链接列表 for w in writable: data_to_client = msg_dic[w].get() #返回给客户端 w.send(data_to_client) #清除旧链接 outputs.remove(w) for e in excepional: if e in outputs: outputs.remove(e) inputs.remove(e) del msg_dic[e]
posted on 2017-12-19 11:52 gaizhongfeng 阅读(279) 评论(0) 编辑 收藏 举报