python select 详解

python select 详解Python中的select模块为异步I/O提供了高级的交互功能,它是一个标准的UNIX系统调用,可以监控文件描述符(socket、文件句柄等),等待某个或某些文件描述符的状态发生变化,从而进行下一步的操作。使用select模块可以实现异步网络编程,提高网络请求的响应速度。

Python中的select模块为异步I/O提供了高级的交互功能,它是一个标准的UNIX系统调用,可以监控文件描述符(socket、文件句柄等),等待某个或某些文件描述符的状态发生变化,从而进行下一步的操作。使用select模块可以实现异步网络编程,提高网络请求的响应速度。

一、select的基本用法

使用select的主要步骤为:创建读、写、异常三个列表,将需要监听的文件描述符添加到这三个列表中,然后调用select函数开始监听,如果有文件描述符的状态发生变化了,select将返回给用户。

    import select
    import socket

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('127.0.0.1', 8000))
    s.listen(5)

    inputs = [s]
    outputs = []
    while True:
        rs, ws, es = select.select(inputs, outputs, inputs)
        for r in rs:
            if r == s:
                client, address = s.accept()
                inputs.append(client)
            else:
                data = r.recv(1024)
                if data:
                    outputs.append(r)
                    r.send(data)
                else:
                    inputs.remove(r)
                    r.close()
        for w in ws:
            outputs.remove(w)

        for e in es:
            if e in inputs:
                inputs.remove(e)
            if e in outputs:
                outputs.remove(e)

            e.close()

在上面的代码中,首先创建了一个Server端的Socket,并设置其监听IP地址和端口号。接着将Server端的监听Socket加入到inputs列表中。循环调用select函数开始监听inputs列表中的Socket,如果有客户端请求连接,将客户端连接Socket加入到inputs列表中。如果有客户端Socket发来数据,将其放入到outputs列表中,然后向客户端Socket发送相同的数据。如果客户端Socket关闭连接,将其从inputs列表中移除。

二、select的高级用法

使用select模块不仅可以实现异步I/O操作,还可以使用它实现多路复用I/O来更高效地处理大量数据。通过将socket描述符放入待检测列表,轮询方法检查socket的传输状态,有数据传输时马上进行处理。

如果在一个进程中同时要处理多个网络连接,使用多线程或多进程会导致系统资源耗用过高。使用select模块可以有效地处理大量I/O操作,而不会耗费太多系统资源。

下面是一个更高级的例子:

    import select
    import socket
    import sys

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_address = ('localhost', 10000)
    server.bind(server_address)
    server.listen(5)
    inputs = [server]

    while True:
        readable, writable, exceptional = select.select(inputs, [], inputs)
        for s in readable:
            if s is server:
                connection, client_address = s.accept()
                connection.setblocking(0)
                inputs.append(connection)
            else:
                data = s.recv(1024)
                if data:
                    s.sendall(data)
                else:
                    inputs.remove(s)
                    s.close()
        for s in exceptional:
            inputs.remove(s)
            s.close()

上面的例子中,使用了select.select方法来轮训监听inputs列表中的socket,将准备好的Socket添加到readable列表中,将异常情况下的Socket添加到exceptional列表中。遍历readable列表中所有的Socket,并对其进行读取或写入。如果一个Socket在读取时发生异常,将把它从inputs列表中移除。

三、select的优缺点

使用select模块可以实现异步I/O操作,提高网络请求的响应速度。同时,使用select模块可以处理大量I/O操作而不会耗费太多系统资源。

但select模块也有一些缺点,其中一个是它对于监听的socket上限有一定的限制(一般不超过1024个)。这意味着,如果你有非常多的socket需要同时监听,可能会遇到一些麻烦。

此外,如果同时监听的socket数量过多,select将不得不遍历和搜索整个socket列表。这将降低select的效率,导致网络请求的响应速度降低。

总结

在Python中,select是一个重要的模块,可以用于异步I/O操作和多路复用I/O操作,提高网络服务的响应速度。使用select模块需要注意Socket的数量限制和效率问题,避免影响网络服务的质量。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/21219.html

(0)
上一篇 2024-04-26
下一篇 2024-04-26

相关推荐

  • 实时开展的意思_全平台直播大数据

    实时开展的意思_全平台直播大数据原文链接:实时开发平台建设实践,深入释放实时数据价值 视频回顾:点击这里 课件获取:点击这里 一、实时数仓建设背景 随着整体行业的数字化转型不断深入以及技术能力的不断提高,传统的 T+1 式(隔日)的

    2023-05-22
    139
  • openapi开发框架_hadoop开源

    openapi开发框架_hadoop开源一、前言 ChunJun(原FlinkX)是一个基于 Flink 提供易用、稳定、高效的批流统一的数据集成工具,既可以采集静态的数据,比如 MySQL,HDFS 等,也可以采集实时变化的数据,比如 b

    2023-06-16
    129
  • 了解Python中的float函数

    了解Python中的float函数在Python编程中,很多情况下需要用到数字,而数字又分为整数和浮点数。其中浮点数是一种有小数点的数字类型。在这篇文章中,我们将会深入了解Python语言中float函数的用法以及相关知识。

    2024-06-15
    38
  • c4d阿诺德渲染器中文_c4d插件下载

    c4d阿诺德渲染器中文_c4d插件下载Solid Angle Cinema4D to Arnold for Mac先进的蒙特卡罗光线追踪渲染器,专为长度动画和视觉效果而设计。可以在Linux,Windows和Mac OS X上作为独立的…

    2023-02-09
    125
  • Mysql工作日志「终于解决」

    Mysql工作日志「终于解决」1. DISTINCT效率极差,可以选择替换groupby,最好能在代码内部去重 2. filesort效率也很低 3. 能使用连接查询尽量不要使用子查询 4. in查询包含内容很多的情况下,不要通…

    2023-03-22
    129
  • 使用redis实现消息队列_redis作为消息队列

    使用redis实现消息队列_redis作为消息队列  众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Z…

    2023-03-09
    117
  • PostGIS 扩展创建失败原因调查「建议收藏」

    PostGIS 扩展创建失败原因调查「建议收藏」Issue 升级 PostgreSQL 9.1 的一个集群,由于该集群用到了 PostGIS,在升级 PostgreSQL 时也需要升级一下 PostGIS。PostGIS 相关软件安装好后,在 Po

    2023-05-18
    118
  • Redis简介与部署 – Linux[通俗易懂]

    Redis简介与部署 – Linux[通俗易懂]一、简介 Redis是什么?redis是一款基于BSD协议,开源的非关系型数据库(nosql数据库),作者是意大利开发者Salvatore Sanfilippo在2009年发布,使用C语言编写;red

    2023-03-27
    128

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注