IO多路复用
程序员文章站
2023-04-06 11:42:47
IO多路复用实现并发服务器 IO多路复用技术 我们把socket交给操作系统去监控 epoll 是惰性的事件回调:惰性事件回调 是由用户进程 自己调用的,操作系统只起到 通知的作用,目前Linux上效率最高的 IO多路复用 技术。 并发服务实现: 服务端 客户端 ......
io多路复用实现并发服务器
io多路复用技术
我们把socket交给操作系统去监控
epoll 是惰性的事件回调:惰性事件回调 是由用户进程 自己调用的,操作系统只起到 通知的作用,目前linux上效率最高的 io多路复用 技术。
并发服务实现:
服务端
import socket
import selectors#io多路选择器模块,使用io多路复用无需设置非阻塞
epoll_selector = selectors.epollselector()#用来和epoll通信的选择器,调用epoll
server = socket.socket()
server.bind(('0.0.0.0',8080))
server.listen(1000)
def read(connection):
recv_data = connection.recv(1024)
if recv_data:
print(recv_data)
connection.send(recv_data)
else:
epoll_selector.unregister(connection)#数据发送完毕,取消注册无需监控
connection.close()
def accept(server):
connection,remote_address = server.accept()
#要准备收数据
epoll_selector.register(connection,selectors.event_read,read)
epoll_selector.register(server,selectors.event_read,accept)#连接过来可读的时候在server上注册事件,accept是回调函数
#事件循环(主动去问epoll哪些socket可以回调,如果有了,就回调他们)
while true:
event = epoll_selector.select()#查询所有已经准备好的事件,返回一个列表{{二元组列表}}
for key,mask in event:
callback = key.data#从key里面把回调函数拿出来
sock = key.fileobj#从key里面把我们注册的那个socket拿出来
callback(socket)#回调
客户端
import socket
host = '192.168.215.128'
port = 8080
client = socket.socket()
client.connect((host,port))
# client.send(b'haha')
msg = input('-->')
client.send(msg.encode('utf-8'))
recv_data = client.recv(1024)
print(recv_data.decode('utf-8'))
client.close()
上一篇: cent os 上安装 matlab