select 实现多路复用IO的server_socket

select 对程序进行同时检测,当发生响应时,数据被拷贝到内核区域,内核区通知用户程序来进行读取数据,内核区域并不知道是客户端连接,因此需要进行循环

server_socket 端

import select, socket, queue

server = socket.socket()
server.bind(('localhost', 6000))
server.listen(1000)

server.setblocking(False) #不会发生阻塞

inputs = [server, ] #创建一个检测列表
outputs = []
msg_dict = {}

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) #如果是一个client连接,把其添加到检测列表中
msg_dict[conn] = queue.Queue() #初始化一个队列
else:
data = r.recv(1024)
msg_dict[r].put(data)
outputs.append(r) #添加到输出列表中


for w in writeable:
data = msg_dict[w].get()
w.send(data)
outputs.remove(w)

for e in exceptional:
if e in outputs:
outputs.remove(e)

inputs.remove(e)

原文地址:https://www.cnblogs.com/my-love-is-python/p/9164834.html