当前位置: 首页 > news >正文

select模块

Python标准库中的select模块,这个模块提供了select函数,它能够监视文件描述符,等待它们变得“就绪”(即可读、可写或发生异常)。这在处理I/O、网络通信或异步操作时非常有用。

select模块的基本使用

导入模块
import select
监听文件描述符
# 创建文件描述符列表
read_fds, write_fds, err_fds = select.select(inputs, outputs, exceptions, timeout)
  • inputs: 等待读就绪的文件描述符列表。
  • outputs: 等待写就绪的文件描述符列表。
  • exceptions: 等待异常的文件描述符列表。
  • timeout: 超时时间。
示例
import select
import socket
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', 8080))
server_socket.listen()
# 设置为非阻塞模式
server_socket.setblocking(0)
# 准备好读取的列表
inputs = [server_socket]
while True:# 使用select监听readable, writable, exceptional = select.select(inputs, [], [])for s in readable:if s is server_socket:# 处理新的连接connection, client_address = s.accept()print("新连接来自", client_address)connection.setblocking(0)inputs.append(connection)else:# 处理客户端数据data = s.recv(1024)if data:print("收到数据:", data)else:# 没有数据表示客户端断开print("关闭连接")inputs.remove(s)s.close()

这个示例创建了一个简单的TCP服务器,它使用select来同时处理多个连接。

Python 的 socket 模块通过使用 selectpoll 系统调用来实现超时判断。这些系统调用允许程序在等待某个文件描述符(例如,socket)的状态变化时指定一个超时值。如果在指定的超时值内没有发生状态变化,系统调用将返回并触发超时异常。以下是这两个系统调用的工作原理和实现方式:

select 系统调用

select 系统调用允许程序监视多个文件描述符,等待它们变为可读、可写或发生异常。select 接受三个文件描述符集和一个超时值作为参数,并在文件描述符状态发生变化或超时后返回。

poll 系统调用

poll 系统调用与 select 类似,但更灵活和高效。它使用一个包含文件描述符及其感兴趣事件的数组,而不是三个独立的文件描述符集。poll 也支持更大的文件描述符数量。

实现原理

在 Python 中,socket 模块通过 _socket 模块和 selectors 模块来使用这些系统调用。以下是一个简化的示例,展示了如何使用 select 来实现超时:

import socket
import select# 创建一个 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置非阻塞模式
s.setblocking(0)# 设置超时(以秒为单位)
timeout = 5# 连接到服务器(注意:此处会立即返回,因为 socket 是非阻塞的)
server_address = ('example.com', 80)
s.connect_ex(server_address)# 使用 select 监视 socket 的可写性(表示连接已建立)
ready = select.select([], [s], [], timeout)if ready[1]:print("Connection established")
else:print("Connection timed out")# 发送一个请求
request = b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
s.sendall(request)# 使用 select 监视 socket 的可读性(表示有响应数据可读)
ready = select.select([s], [], [], timeout)if ready[0]:response = s.recv(4096)print("Response received")print(response.decode('utf-8'))
else:print("Receiving response timed out")# 关闭 socket
s.close()

在这个示例中:

  1. 创建和配置 socket

    • 创建一个 TCP socket,并将其设置为非阻塞模式,以便 connect_ex 调用不会阻塞程序执行。
  2. 连接到服务器

    • 使用 connect_ex 方法发起连接请求。由于 socket 是非阻塞的,这个调用会立即返回。
  3. 使用 select 监视连接状态

    • 使用 select 函数监视 socket 的可写性(表示连接已建立)。如果在指定的超时时间内 socket 变为可写,连接成功;否则,连接超时。
  4. 发送请求和接收响应

    • 发送请求数据后,再次使用 select 监视 socket 的可读性(表示有数据可读)。如果在指定的超时时间内 socket 变为可读,读取响应数据;否则,接收超时。

通过这种方式,Python 的 socket 模块利用 selectpoll 系统调用实现了对网络操作的超时判断和处理。

相关文章:

  • 微信小程序学习笔记(1)
  • linux编辑器-vim
  • vue解决跨域问题
  • Spark RDD算子
  • 代码随想录算法训练营第三十一天| 455.分发饼干,376. 摆动序列 ,53. 最大子序和
  • 10进制与二、八、十六进制的转换
  • Day25 首页待办事项及备忘录添加功能
  • MFC 使用sapi文字转换为语音
  • 跨域、JSONP、CORS、Spring、Spring Security解决方案
  • maven的install不报错但deploy到nexus报400错误
  • AI大模型探索之路-实战篇16:优化决策流程:Agent智能数据分析平台中Planning功能实践
  • Python 中的装饰器及其作用
  • Oracle数据库连接并访问Microsoft SQL Server数据库
  • Apple开发者macOS设备与描述文件Profile创建完整过程
  • 协程库——面试问题
  • docker容器内的网络抓包
  • react 代码优化(一) ——事件处理
  • Swoft 源码剖析 - 代码自动更新机制
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 阿里云应用高可用服务公测发布
  • 初探 Vue 生命周期和钩子函数
  • 记一次删除Git记录中的大文件的过程
  • 简析gRPC client 连接管理
  • 免费小说阅读小程序
  • 如何解决微信端直接跳WAP端
  • 如何胜任知名企业的商业数据分析师?
  • 什么是Javascript函数节流?
  • 提醒我喝水chrome插件开发指南
  • 微信小程序实战练习(仿五洲到家微信版)
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​Python 3 新特性:类型注解
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #define用法
  • ${ }的特别功能
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)(1.11) SiK Radio v2(一)
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (C11) 泛型表达式
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (一)Docker基本介绍
  • .dwp和.webpart的区别
  • .NET Core中的去虚
  • .NET Remoting学习笔记(三)信道
  • .NET 常见的偏门问题
  • .Net6 Api Swagger配置
  • .Net下的签名与混淆
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @angular/cli项目构建--Dynamic.Form
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [AIGC codze] Kafka 的 rebalance 机制
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现