python的I/O多路复用的实现

IO多路复用socketServer

利用IO多路复用写一个socketServer,大多数情况下机几乎很难用到,因为有许许多多模块和框架已经为我们封装好了,简单了解一下底层的实践即可.

代码实现如下:

import  select
import socket
import  queue

#创建socket连接
server = socket.socket()
server.bind(('localhost',9000))
server.listen(1000)

#设置非阻塞模式
server.setblocking(False)

#key 为接受消息对象实例,key 为接受的数据
mes_dic = {}

#需要检测的连接列表
inputs = [server,]

#返回上一次的数据列表
outputs = []

while True:
    readable,writeable,exceptional = select.select(inputs,outputs,inputs)

    for r in  readable:
        if r is server:#代表来了一个新连接
            conn,addr = server.accept()
            inputs.append(conn)#因为新建立的连接还没发数据过来,现在就接受的话程序就报错
            #所以要想实现这个客户端发数据时server端能知道,就需要让select再监测
            #初始化一个队列,后面存要返回给这个客户端的数据
            mes_dic[conn] = queue.Queue()
        else:
           data = r.recv(1024)
           mes_dic[r].put(data)
           #放入返回的连接队列里
           outputs.append(r)

    #要返回给客户端的连接列表
    for w in writeable:
        data_to_client = mes_dic[w].get()
        #返回给客户端源数据
        w.send(data_to_client)

        #确保下次循环的时候writeable,不反回这个已经处理完的连接
        outputs.remove(w)

    #异常
    for e in exceptional:
        if e in outputs:
            outputs.remove(e)
        inputs.remove(e)
        del  mes_dic[e]

I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

你可能感兴趣的:(python的I/O多路复用的实现)