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()


详情请见网络IO之阻塞、非阻塞、同步、异步总结

IO-同步,异步,阻塞,非阻塞

 

转载于:https://www.cnblogs.com/Gluneko/p/9556882.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值