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技术站