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编辑  收藏  举报