python中IO的多路复用poll应用

本文深入探讨Python中的IO多路复用,重点解析如何使用poll模块进行高效地并发处理。通过实例展示如何监控多个文件描述符,实现非阻塞IO,提升程序的响应速度和资源利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""
poll  :   linux,unix
                    1.创建poll对象       p=select.poll()
                    2.注册关注的IO事件     p.register(fd,event)
                                        p.register(sockfd,POLLIN|POLLERR)
                    3.取消对IO的关注      p.unregister(fd)  fd:IO对象或者IO对象的fileno
                    4.阻塞等待监控的IO事件发生     events=p.poll()
                                            返回的是元组格式[(fileno,event),()...] 文件描述符和事件类型
实现步骤 :
        1.创建套接字
        2.将套接字register加入关注
        3.创建查找字典,并维护
        4.循环监控IO事件
        5.处理发生的IO
epoll用法相似将poll改成epoll
"""

from socket import *
import select

# 创建tcp套接字
soc = socket(AF_INET, SOCK_STREAM)
# 开启端口立即重用
soc.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 绑定服务器地址
soc.bind(("127.0.0.1", 9090))
# 开启监听服务
soc.listen(3)
# 创建字典,并以套接字描述符为键,套接字为值,添加字典对象
# 始终与register的IO保持一致
dic = {soc.fileno(): soc}

# 创建poll对象
p = select.poll()
# 加入关注,并监控读取事件发生
p.register(soc, select.POLLIN)
print("waiting connect ...")
# 循环等待接收客户端连接请求
while True:
    # 阻塞等待IO事件发生(返回值是一对对元组组成(IO描述符,监控事件类型))
    event = p.poll()
    # 循环遍历列表,查看那个IO就绪,就处理
    for so, even in event:
        # 区分那个IO就绪
        if so == soc.fileno():
            c, addr = dic[so].accept()
            print("connect from ", addr)
            # 关注客户端连接套接字
            p.register(c, select.POLLIN | select.POLLERR)
            # 维护字典,更新数据
            dic[c.fileno()] = c
        elif even & select.POLLIN:
            data = dic[so].recv(1024).decode()
            if not data:
                # 取消对IO的关注
                p.unregister(so)
                # 关闭IO套接字
                dic[so].close()
                # 从字典中移除
                del dic[so]
                continue
            print("c>>", data)
            dic[so].send(b"OK")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值