select模块
可以不使用while True 解决堵塞IO问题
在Windows上,只支持套接字;在Unix上,可以使用所有文件描述符。
poll模型 linux 可用 操作系统可以用,监听的列表比较多,随着列表的增加,效率降低
epoll模型 linux可用 监听列表,需要绑定回调函数。效率比较高(selectors模块)
使用select模块实现socket聊天:
import select
import socket
so = socket.socket()
so.bind(("127.0.0.1", 9999))
so.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# so.setblocking(False)
so.listen()
read_list = [so]
# print(rlist)
while True:
rlist, wlist, xlist = select.select(read_list, [], [])
for i in rlist:
if i is so:
conn, addr = i.accept()
read_list.append(conn)
else: # elif i is conn:
ret = i.recv(1024)
if ret == b"":
i.close()
read_list.remove(i)
continue
print(ret.decode("UTF-8"))