新闻中心
Python select 模块要怎么使用?
答案:Python的select模块实现I/O多路复用,通过select.select()监控文件描述符的可读、可写和异常状态,适用于单线程处理多连接场景。示例中构建了非阻塞TCP服务器,监听新连接并收发数据,需维护输入、输出和异常列表,每次调用select前重新传入描述符列表。注意描述符数量限制(通常1024),推荐使用selectors或asyncio提升性能与可维护性。

Python 的 select 模块用于监控多个文件描述符(如套接字),判断它们是否可读、可写或出现异常。它常用于 I/O 多路复用,适用于需要同时处理多个网络连接但不想使用多线程或多进程的场景。
基本用法:select.select()
核心函数是 select.select(read_list, write_list, error_list, timeout),它接收三个列表和一个超时时间:
- read_list:监听是否可读的文件描述符列表
- write_list:监听是否可写的文件描述符列表
- error_list:监听是否有错误的文件描述符列表
- timeout:超时时间(秒),None 表示无限等待
函数返回三个列表,分别对应当前就绪的可读、可写和出错的文件描述符。
监听套接字的简单服务器示例
下面是一个使用 select 实现的简单 TCP 服务器:
import select import socket <h1>创建服务端套接字</h1><p>server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_sock.bind(('localhost', 8888)) server_sock.listen(5) server_sock.setblocking(False) # 设为非阻塞</p><h1>初始化监听列表</h1><p>inputs = [server_sock] # 监听可读事件 outputs = [] # 监听可写事件(可选) excepts = [] # 异常监听</p><p>print("Server running on localhost:8888")</p> <div class="aritcle_card"> <a class="aritcle_card_img" href="/xiazai/code/6709"> <img src="https://img.php.cn/upload/webcode/000/287/557/605d33770a587317.png" alt="企业软件介绍主页html模板"> </a> <div class="aritcle_card_info"> <a href="/xiazai/code/6709">企业软件介绍主页html模板</a> <p>一款多用途的企业软件前端HTML模板。IT软件服务公司网站响应式单页模板。基于CSS、JS、HTML模块化原则创建的。如果您的站点不需要所有元素,那么可以轻松地删除不必要的组件。模板的代码干净,友好,注释良好。这使得编辑和自定义模板变得很容易。</p> <div class=""> <img src="/static/images/card_xiazai.png" alt="企业软件介绍主页html模板"> <span>350</span> </div> </div> <a href="/xiazai/code/6709" class="aritcle_card_btn"> <span>查看详情</span> <img src="/static/images/cardxiayige-3.png" alt="企业软件介绍主页html模板"> </a> </div> <p>while True:</p><h1>调用 select</h1><pre class='brush:python;toolbar:false;'>readable, writable, exceptional = select.select(inputs, outputs, inputs, 1.0) for sock in readable: if sock is server_sock: # 有新连接 client_sock, addr = sock.accept() client_sock.setblocking(False) inputs.append(client_sock) print(f"New connection from {addr}") else: # 已有连接发来数据 try: data = sock.recv(1024) if data: print(f"Received: {data.decode()}") # 可以加入到输出列表,准备回传 if sock not in outputs: outputs.append(sock) else: # 客户端断开 print("Client disconnected") if sock in outputs: outputs.remove(sock) inputs.remove(sock) sock.close() except ConnectionResetError: inputs.remove(sock) if sock in outputs: outputs.remove(sock) sock.close() for sock in writable: # 这里可以发送响应 try: sock.send(b"Echo: Message received\n") outputs.remove(sock) # 发送完移除 except Exception as e: print(f"Send error: {e}") inputs.remove(sock) outputs.remove(sock) sock.close() for sock in exceptional: # 处理异常 inputs.remove(sock) if sock in outputs: outputs.remove(sock) sock.close()
注意事项与限制
- select 支持的文件描述符数量有限(通常 1024),在 Linux 上推荐使用 poll 或 epoll(可通过 selectors 模块统一接口)
- 所有套接字应设为非阻塞模式,避免 recv/send 阻塞整个程序
- 每次调用 select 前需重新构建监听列表(因为内核会修改)
- 跨平台兼容性好(Windows/Linux 都支持)
更现代的替代方案
对于复杂应用,建议使用更高层模块:
- selectors 模块:提供统一接口,自动选择 select/poll/epoll/kqueue
- asyncio:基于事件循环的异步编程,适合高并发
例如用 selectors 改写会更简洁且性能更好。
基本上就这些。select 模块不复杂但容易忽略细节,掌握它有助于理解底层网络编程机制。
以上就是Python select 模块要怎么使用?的详细内容,更多请关注其它相关文章!
# 多路
# 内蒙古网站建设操作
# 网站建设 常用字体
# 麦克风营销推广方案
# 快速写网站推广讲座
# 开平网站seo推广
# 智能网站优化价格查询
# 什么叫校园网站推广员
# 淘客cms网站推广
# 广东国外网站建设排名
# 线上推广营销案例分析
# 是一个
# 复用
# linux
# 适用于
# 推荐使用
# 设为
# 多个
# 多线程
# 软件介绍
# 网络编程
# stream
# win
# app
# windows
# python
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
CSS子选择器:如何区分并样式化嵌套列表的子层级
将JSON对象数组转置为键值对列表的实用指南
mc.js免安装版 mc.js一键畅玩入口
React/Next.js中实现列表项的动态选择与移动
J*aScript Promise链中如何正确终止后续.then执行并处理错误
极兔快递快件信息查询系统 极兔快递官网运单号追踪
夸克AO3官网入口_AO3镜像网站2025推荐
Centos/Linux 系统下安装 composer 的完整步骤
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
C++如何实现单例模式_C++设计模式之线程安全的单例写法
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
探索高级语言到原生C/C++的转译:挑战与内存管理策略
J*aScript中如何高效提取对象指定属性
Pandas DataFrame 多条件优先级排序与排名
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
excel如何生成目录 excel一键生成工作表目录超链接
Go语言中JSON数据解析与字段访问教程
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
Lar*el DB::listen 事件中的查询执行时间单位解析
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
小红书网页版入口链接分享 小红书官网直接进
AO3最新官网入口公告_2025AO3镜像站实时查询方法
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
铃兰之剑为这和平的世界希里技能组及加点推荐
Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】
学习通在线学习平台 学习通网页版直接进入课程中心
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
火锅吃太多会怎样 火锅吃太多会上火吗
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
深入理解Go语言中的指针类型:以*string为例
Lar*el递归关系中排除子孙节点的策略
J*aScript map 方法中处理循环元素为空数组的策略
outlook中文官网入口地址 outlook官方中文版直达首页链接
J*aScriptWebpack优化_J*aScript构建工具实战
深入理解J*a链表中的IPosition接口与使用
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
解决Python单元测试中Mock异常方法调用计数为零的问题
AngularJS $http POST请求数据传递与Go后端接收实践
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
J*a TimerTask中HashMap意外清空的深层原因与解决方案
怎么在mac上运行html代码_mac运行html代码方法【指南】
css链接悬停下划线样式如何自定义_使用::after结合content和transition
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道


2025-11-29
浏览次数:次
返回列表
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_sock.bind(('localhost', 8888))
server_sock.listen(5)
server_sock.setblocking(False) # 设为非阻塞</p><h1>初始化监听列表</h1><p>inputs = [server_sock] # 监听可读事件
outputs = [] # 监听可写事件(可选)
excepts = [] # 异常监听</p><p>print("Server running on localhost:8888")</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/xiazai/code/6709">
<img src="https://img.php.cn/upload/webcode/000/287/557/605d33770a587317.png" alt="企业软件介绍主页html模板">
</a>
<div class="aritcle_card_info">
<a href="/xiazai/code/6709">企业软件介绍主页html模板</a>
<p>一款多用途的企业软件前端HTML模板。IT软件服务公司网站响应式单页模板。基于CSS、JS、HTML模块化原则创建的。如果您的站点不需要所有元素,那么可以轻松地删除不必要的组件。模板的代码干净,友好,注释良好。这使得编辑和自定义模板变得很容易。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="企业软件介绍主页html模板">
<span>350</span>
</div>
</div>
<a href="/xiazai/code/6709" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="企业软件介绍主页html模板">
</a>
</div>
<p>while True:</p><h1>调用 select</h1><pre class='brush:python;toolbar:false;'>readable, writable, exceptional = select.select(inputs, outputs, inputs, 1.0)
for sock in readable:
if sock is server_sock:
# 有新连接
client_sock, addr = sock.accept()
client_sock.setblocking(False)
inputs.append(client_sock)
print(f"New connection from {addr}")
else:
# 已有连接发来数据
try:
data = sock.recv(1024)
if data:
print(f"Received: {data.decode()}")
# 可以加入到输出列表,准备回传
if sock not in outputs:
outputs.append(sock)
else:
# 客户端断开
print("Client disconnected")
if sock in outputs:
outputs.remove(sock)
inputs.remove(sock)
sock.close()
except ConnectionResetError:
inputs.remove(sock)
if sock in outputs:
outputs.remove(sock)
sock.close()
for sock in writable:
# 这里可以发送响应
try:
sock.send(b"Echo: Message received\n")
outputs.remove(sock) # 发送完移除
except Exception as e:
print(f"Send error: {e}")
inputs.remove(sock)
outputs.remove(sock)
sock.close()
for sock in exceptional:
# 处理异常
inputs.remove(sock)
if sock in outputs:
outputs.remove(sock)
sock.close()