Python3中IO多路复用
selectors
模块建立在 选择 select
基础之上,它是在 python3.4
版本中引进的,它封装了IO多路复用中的 select
和epoll
能够更快,更方便的实现高并发效果。
import socket
import selectors
selector = selectors.DefaultSelector()
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.bind(('0.0.0.0', 1024))
# 设置为非阻塞
server.setblocking(False)
server.listen()
# 注册到selector,监听读事件
selector.register(server, selectors.EVENT_READ)
# 处理连接事件
def accept(key,event):
connection,address = key.fileobj.accept()
# 设置为非阻塞模式
connection.setblocking(False)
# 注册读事件
selector.register(connection, selectors.EVENT_READ)
# 处理读取事件
def readable(key,event):
connection = key.fileobj
data = connection.recv(1024) # 读取数据
if data:
print('收到数据:%s'%(data.decode('UTF_8')))
else:
selector.unregister(connection) # 连接关闭,移除注册
connection.close()
while True:
# 开始轮询
results = selector.select()
for key , event in results:
if key.fileobj == server:
accept(key,event)
else:
readable(key,event)
跟Java的nio差不多一个德行,但是感觉它相对简单点儿。
添加评论