Python select及selectors模块概念用法详解

Python select及selectors模块概念用法详解

什么是select?

select是一个 Unix 系统中用来实现I/O多路复用的函数。I/O多路复用指的是通过一种机制,使得一个进程能够监视多个文件描述符,一旦某个文件描述符就绪(一般是读写就绪),能够通知程序进行相应的操作。

select有三个参数,第一个参数是所监视的文件描述符集合,它告诉select去监视哪些文件描述符;第二个参数是一个输出参数,告诉我们哪些文件描述符已经就绪;第三个参数是超时时间,如果在该时间内没有任何文件描述符就绪,select函数返回。

Python中select模块的使用

在Python中,可以通过select模块来使用select函数。下面是一个简单的示例代码:

import select
import socket

s_sock = socket.socket()
s_sock.bind(('127.0.0.1', 8888))
s_sock.listen(5)
inputs = [s_sock]

while True:
    rlist, wlist, elist = select.select(inputs, [], [])
    for r in rlist:
        if r == s_sock:
            conn_sock, addr = s_sock.accept()
            inputs.append(conn_sock)
        else:
            data = r.recv(1024)
            if not data:
                inputs.remove(r)
                r.close()
            else:
                r.sendall(data)

该代码中,我们创建了一个socket套接字并监听端口,接着通过select模块的select函数来监听该socket是否有客户端连接。如果连接成功,则将该连接的socket加入到inputs数组中,并继续监听socket。如果inputs中的某个socket有数据到达,则读取数据并发送回去。

什么是selectors?

selectors是Python标准库中封装了select、epoll、kqueue等系统调用的高级I/O多路复用模块。

selectors模块提供了一个Selector的类,该类实现了select的常用功能,并对其进行了封装和优化。

selectors的使用

下面是一个使用selectors模块的示例代码:

import selectors
import socket

sel = selectors.DefaultSelector()
s_sock = socket.socket()
s_sock.bind(('127.0.0.1', 8888))
s_sock.listen(5)
sel.register(s_sock, selectors.EVENT_READ, data=None)

while True:
    events = sel.select()
    for key, mask in events:
        if key.data is None:
            conn_sock, addr = s_sock.accept()
            sel.register(conn_sock, selectors.EVENT_READ, data=b'')
        else:
            sock = key.fileobj
            data = sock.recv(1024)
            if not data:
                sel.unregister(sock)
                sock.close()
            else:
                sock.sendall(data)

该代码通过selectors模块创建了一个Selector对象,并将socket加入到监听队列中。在循环中,通过select方法获取到有事件的socket并处理。

示例说明

示例一

上面的第一个示例代码是一个简单的socket服务端,监听端口并处理客户端连接和数据传输。通过使用select模块,可以实现该服务端按照I/O多路复用的方式处理多个连接。

示例二

上面的第二个示例代码同样是一个socket服务端,但是使用的是selectors模块。相比于第一个示例代码,selectors模块提供了更加高级的I/O多路复用机制,并对select进行了优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python select及selectors模块概念用法详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python 带星号(* 或 **)的函数参数详解

    Python带星号(或*)的函数参数详解 在Python中,我们可以通过在函数定义时使用带星号的参数来接受不定数量的参数,这种参数被称作“星号参数”。其中,单个星号()用于接受不定数量的位置参数,双星号(*)则用于接受不定数量的关键字参数。本文将对这两种星号参数进行详细的讲解。 接受不定数量的位置参数 我们可以在任意一个参数名前面使用单个星号(*)来定义一个…

    python 2023年5月14日
    00
  • Python定时执行之Timer用法示例

    Python定时执行之Timer用法示例 在Python中,使用timer来实现定时执行任务是一种非常常见的方法。Timer是一个基于线程的类,可以用来在指定时间内执行某个操作,也可以用来实现定时任务。在本文中,我们将重点介绍Python中Timer的使用方法,并给出两个实际的应用示例。 Timer基本用法 Timer是Python中自带的模块,使用方法也非…

    python 2023年6月2日
    00
  • 详解Python PIL ImageFont.load_default()

    ImageFont.load_default()是Python PIL库中的一个函数,主要用于加载操作系统的默认字体。下面是详细的使用攻略: 函数原型 ImageFont.load_default() 函数参数 该函数没有任何参数。 函数返回值 返回一个ImageFont类型的对象。 使用方法 首先需要导入PIL库: from PIL import Imag…

    python-answer 2023年3月25日
    00
  • python实现基于SVM手写数字识别功能

    下面我将详细讲解“python实现基于SVM手写数字识别功能”的完整攻略,包含以下几个步骤: 1. 数据集准备 首先,我们需要准备一个手写数字的数据集,这个数据集可以从MNIST官网上下载到,网址是http://yann.lecun.com/exdb/mnist/。它包含了大量手写数字的图像和对应的标签。我们可以使用python中的numpy和pickle库…

    python 2023年5月18日
    00
  • python对接ihuyi实现短信验证码发送

    当您需要使用Python编写应用程序并实现短信验证码发送时,可以使用ihuyi提供的API来实现。在本攻略中,我们将介绍如何使用Python对接ihuyi实现短信验证码发送。以下是一个完整攻略,包括两个示例。 步骤1:注册ihuyi账号并获取API信息 首先,我们需要注册ihuyi账号并获取API信息。我们可以在ihuyi官网上注册账号,并在控制台中获取AP…

    python 2023年5月15日
    00
  • Python 运算符的星号映射

    下面是Python运算符中星号映射的详细讲解。 星号映射的作用 在Python中,星号“”可以用作数据解包或者是函数参数传递时的占位符。而在函数定义中,星号“”后面的变量可以接收未命名的参数列表。 另外,还可以使用星号来映射字典中的键和值,得到键和值的列表。 星号映射的使用方法 1. 星号解包 我们可以使用星号“*”对一个可迭代对象进行解包操作,将其中的每个…

    python-answer 2023年3月25日
    00
  • 使用pandas的box_plot去除异常值

    使用pandas的box_plot去除异常值是一种常用的数据预处理方法,可以有效地去除一些可能会影响数据分析的异常点。以下是使用pandas的box_plot去除异常值的完整攻略: 1. 数据导入 首先需要导入要进行异常值去除的数据。可以使用pandas的read_csv函数读取CSV、TXT、TSV等格式的数据文件。例如,读取名为”data.csv”的CS…

    python 2023年5月13日
    00
  • Python源码解析之List

    Python中的列表(List)是一种常用的数据类型,可以存储多个元素。本文将详细讲解Python中列表的源码实现,包括列表的内部结构、列表的创建、添加元素、删除元素、修改、切片操作等,并提供两个实例说明。 列表的内部结构 Python中的列表是一种动态数组,它的内部结构由以下三个部分组成: 指向列表元素的指针数组 列表长度 列表的容量 指向列表元素的指针数…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部