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 系统调用实现了对网络操作的超时判断和处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

能打印出一条虚线的程序

目录 开头程序程序输入与打印的效果输入输入1输入2 打印打印1打印2 流程图结尾 开头 大家好&#xff0c;我叫这是我58&#xff0c;现在&#xff0c;请你先看一下下面的程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() {int i 0;int ia…

解析智慧机场系统的架构与未来发展趋势

在全球航空业快速发展的背景下&#xff0c;智慧机场系统已经成为提升机场运营效率、优化旅客体验的重要手段。智慧机场系统的架构设计涵盖了多个方面&#xff0c;从航班管理到安全检查&#xff0c;从旅客服务到数据分析&#xff0c;都有着精心设计和完善的技术支持。本文将深入…

Apipost安装教程

&#x1f4d6;Apipost安装教程 ✅1. 下载✅2. 安装 ✅1. 下载 官网地址&#xff1a;https://www.apipost.cn/ 选择免费版&#xff0c;下载对应系统的安装包即可。 ✅2. 安装 1.点击运行apipost_win_x64_8.0.11.exe安装包&#xff0c;并选择用户安装&#xff0c;下一步 2.选…

【Kubernetes】Ingress 对外服务、ingress-controlle

Ingress 简介 service的作用体现在两个方面&#xff1a; 对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b; 对集群外部&#xff0c;他类似负载均衡器&#xff0c;可以在集群内…

架构演化过程中,如何确保核心功能不受影响?

在架构演化过程中确保核心功能不受影响是至关重要的。以下是一些策略和最佳实践&#xff0c;可以帮助在架构演化时保持核心功能的稳定性和可靠性&#xff1a; 明确核心功能&#xff1a;首先&#xff0c;需要清晰地定义哪些功能是核心的&#xff0c;这些功能对业务至关重要&…

java kotlin python 日志记录

Python中的日志记录 在Python项目中使用日志记录库&#xff0c;并限制日志文件大小为50MB&#xff0c;同时设置日志文件的滚动策略&#xff0c;使用logging库和logging.handlers.RotatingFileHandler。以下是具体步骤&#xff1a; 配置日志记录 创建一个日志配置文件&#x…

adb检测系统是否使用生产秘钥进行签名

系统签名检测 如果发现testkey.x509.pem就是开发版的系统&#xff0c;是不可信的&#xff0c;或者会被检测出来自定义ROM。 adb shell unzip -l /system/etc/security/otacerts.zip Archive: /system/etc/security/otacerts.zipLength Date Time Name --------- …

如何评估pcdn调度算法的优化效果(壹)

评估PCDN&#xff08;Peer-assisted Content Delivery Network&#xff0c;对等网络内容分发网络&#xff09;调度算法的优化效果是一个综合且系统的过程&#xff0c;涉及多个维度的考量。以下是一些建议的步骤和考量因素&#xff0c;以便全面评估优化效果&#xff1a; 一&…

服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景&#xff1a; 虚拟机上Ubuntu系统安装了Mysql&#xff0c;现在有一个服务应用需要使用docker来部署&#xff0c;服务应用需要连接mysql做数据库基础使用&#xff0c;配置文件中配置了虚拟主机的IP和端口&#xff0c;但是还是无法连接到Mysql&#xff0c;报错无法连接超…

stm32MP135裸机编程:修改基于SD卡的FSBL-A用户程序引导程序(boot)

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf stm32mp135官方开发板原理图&#xff08;mb1635-bdp-v1-0.zip&#xff09; STM32Cube_FW_MP13_V1.0.0 STM32CubeIDE v1.15 1 为什么需要修改FSBL-A用户程序引导程序 FSBL-A用户程序引导程序的作用在《…

v-for

v-for 是 Vue.js 框架中的一个重要指令&#xff0c;用于渲染列表或数组元素。它允许你在 HTML 元素上迭代一个数据集合&#xff0c;将每个数据项映射到一个或多个 DOM 元素中。使用 v-for 的基本语法如下&#xff1a; html <template> <ul> <li v-for&qu…

Spark 面试题(二)

1. 简述Spark的作业运行流程是怎么样的 &#xff1f; Apache Spark的作业运行流程涉及从作业提交到执行完成的一系列步骤&#xff0c;具体如下&#xff1a; 作业提交&#xff1a;用户编写的Spark应用程序通过Spark API提交给集群。这通常涉及到创建一个SparkContext对象&#…

03-240605-Spark笔记

03-240605 1. 行动算子-1 reduce 聚合 格式: def reduce(f: (T, T) > T): T 例子&#xff1a; val sparkConf new SparkConf().setMaster("local[*]").setAppName("Operator")val sc new SparkContext(sparkConf) ​val rdd sc.makeRDD(List(1…

基础IO (Linux文件操作)

目录 1.文件操作 2.文件描述符 3.缓冲区 4.系统的缓冲区 1.文件操作 在C语言学习中&#xff0c;我们就已经使用了一些文件操作相关的接口&#xff0c;在学习IO之前&#xff0c;我们首先要复习一些以前讲过的概念&#xff0c; 1. 空文件也要在磁盘中占用空间&#xff0c;因为…

OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装注意事项&#xff1a;包内有两个版本及圆形图片&#xff0c;请根据自身需要版本进行安装演示为&#xff1a;MacBook Pro M3芯片1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff08;最终目的&#xff1a;安装进…

python教程

python解释器的安装 https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe jetbrains官网 英文 PyCharm 专业的版本 Thank you for downloading PyCharm! 社区 Thank you for downloading PyCharm! 中文 PyCharm 专业的版本 感谢您下载PyCharm&#xff01…

[大模型]GLM-4-9B-Chat WebDemo 部署

环境准备 在autodl平台中租一个4090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.1.0–>3.10(ubuntu22.04)–>12.1 接下来打开刚刚租用服务器的JupyterLab&#xff0c; 图像 并且打开其中的终端开始环境配置、模型下载和运行演示。 pip换源和安装…

#12 深入Stable Diffusion模型微调与个性化

文章目录 前言1. 模型微调的重要性2. 微调前的准备2.1 数据收集2.2 环境配置 3. 实施微调3.1 参数设置3.2 训练过程 4. 个性化定制4.1 风格定制4.2 功能扩展 5. 微调后的评估与应用5.1 性能评估5.2 部署应用 结论 前言 Stable Diffusion作为一种先进的AI图像生成技术&#xff…

【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题

文章目录 1 前言2 导包导入数据集3 创建多路图&#xff0c;导入节点和边信息3 绘制线路图4 计算最短路径 1 前言 最近正在学习图神经网络&#xff0c;先pick up了一些最基础的图论知识并学习了一些好玩的应用。 本文启发于B站视频&#xff08;BV1LY411R7HJ&#xff09;&#…

【Python深度学习】——交叉熵|KL散度|交叉熵损失函数

【Python深度学习】——交叉熵|KL散度|交叉熵损失函数 1. 交叉熵Cross Entropy1.1 交叉熵的含义1.2 交叉熵的公式1.3 交叉熵的特点 2. KL散度2.1 KL散度的含义2.2 KL散度的公式2.3 KL散度的性质2.4 KL散度的常用场景 3. 交叉熵损失函数3.1 交叉熵损失函数的定义与公式 1. 交叉熵…