2023-简单点-python的多路复用小例子

Python 实现的多路复用

# 导入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, selectors.EVENT_READ, accept)  
  
# 开始主循环,不断监听和处理事件  
while True:  
    # 等待事件的发生,最多等待一个毫秒,如果没有事件发生,则继续等待  
    events = sel.select()  
    # 遍历所有的事件  
    for key, mask in events:  
        # 获取事件的回调函数  
        callback = key.data  
        # 调用回调函数处理事件  
        callback(key.fileobj, mask)  

多路复用如何知道fd就绪了?如何优化时间?

除了轮询、事件通知、非阻塞I/O和异步I/O等方法外,还有一些其他方法可以优化内核监控文件描述符的性能:

  • 使用更高效的数据结构:内核可以使用更高效的数据结构来管理文件描述符的状态,例如使用哈希表或红黑树等数据结构来快速查找和更新文件描述符的状态。

  • 减少数据拷贝:内核可以尽可能减少数据拷贝,例如通过使用缓冲区或直接在内核空间处理数据,避免多次拷贝数据导致的性能下降。

  • 并发处理:
    内核可以使用并发处理技术,例如多线程或多进程,同时处理多个文件描述符的状态变化,提高处理效率。

  • 使用硬件加速:现代硬件设备往往提供了加速I/O操作的功能,例如使用SSD代替HDD可以大幅度提升磁盘I/O性能。因此,内核可以利用这些硬件加速功能来优化文件描述符的监控和处理。

优化事件处理

内核可以优化事件处理机制,例如减少事件处理的开销,使用更高效的事件处理方式,从而加快文件描述符的状态变化和处理速度。
这些方法都可以在一定程度上优化内核监控文件描述符的性能,提高应用程序处理大量并发连接和数据传输的效率。

fd的状态有哪些?

在I/O多路复用中,文件描述符(fd)的状态主要有以下几种:

1.就绪状态(ready):文件描述符已经准备好进行读或写操作,应用程序可以直接对其进行读或写操作。

2.未就绪状态(not ready):文件描述符尚未准备好进行读或写操作,需要等待其状态变化。

3.错误状态(error):文件描述符出现了错误,无法进行正常的读或写操作。应用程序需要处理该错误。

4.关闭状态(closed):文件描述符已经关闭,无法再进行读或写操作。
这些状态可以用于描述文件描述符在不同时刻的状态,以便应用程序能够根据状态进行相应的处理。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值