# 导入selectors模块,这个模块可以实现I/O多路复用
import selectors
# 导入socket模块,这个模块可以创建网络socket进行通信
import socket
# 创建一个selectors的DefaultSelector实例,这个实例会管理所有的I/O事件
sel = selectors.DefaultSelector()
# 定义一个函数accept,这个函数会在有新的客户端连接请求时被调用
def accept(sock, mask):
# 接受客户端的连接请求,返回一个新的连接和客户端的地址
conn, addr = sock.accept() # Should be ready
# 打印一条消息,表明已经接受了新的连接
print('accepted', conn, 'from', addr)
# 将新的连接设置为非阻塞模式
conn.setblocking(False)
# 在selectors中注册新的连接,当连接准备好读取时,调用read函数
sel.register(conn, selectors.EVENT_READ, read)
# 定义一个函数read,这个函数会在连接准备好读取时被调用
def read(conn, mask):
# 从连接中读取数据,最多读取1000个字节
data = conn.recv(1000) # Should be ready
# 如果读取到了数据
if data:
# 打印一条消息,表明正在将接收到的数据回显给客户端
print('echoing', repr(data), 'to', conn)
# 将接收到的数据发送回客户端
conn.send(data) # Hope it won't block
else:
# 打印一条消息,表明正在关闭连接
print('closing', conn)
# 从selectors中注销连接
sel.unregister(conn)
# 关闭连接
conn.close()
# 创建一个socket,并绑定到localhost的1234端口,监听来自客户端的连接请求
sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
# 将socket设置为非阻塞模式,这样在等待事件时不会被阻塞
sock.setblocking(False)
# 在selectors中注册socket,当有新的客户端连接请求时,调用accept函数
sel.register(sock, sele
Python 实现的多路复用
于 2025-01-22 15:24:38 首次发布