Python select 模块要怎么使用?

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

python select 模块要怎么使用?

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 服务器:

立即学习Python免费学习笔记(深入)”;

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 上推荐使用 pollepoll(可通过 selectors 模块统一接口)
  • 所有套接字应设为非阻塞模式,避免 recv/send 阻塞整个程序
  • 每次调用 select 前需重新构建监听列表(因为内核会修改)
  • 跨平台兼容性好(Windows/Linux 都支持)

更现代的替代方案

对于复杂应用,建议使用更高层模块:

  • selectors 模块:提供统一接口,自动选择 select/poll/epoll/kqueue
  • asyncio:基于事件循环的异步编程,适合高并发

例如用 selectors 改写会更简洁且性能更好。

基本上就这些。select 模块不复杂但容易忽略细节,掌握它有助于理解底层网络编程机制。

以上就是Python select 模块要怎么使用?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号