Python中的select模块是一个高效的I/O多路复用模块,可以用于同时监视多个文件描述符的状态。本攻略将介绍select模块的基本用法和示例。
select模块基础
select模块提供了三个函数:select、poll和epoll。这些函数都可以用于监视多个文件描述符的状态,并在文件描述符就绪时通知应用程序。以下是一个示例代码,用于使用select模块监视标准输入:
import select
import sys
while True:
r, w, e = select.select([sys.stdin], [], [])
if sys.stdin in r:
line = sys.stdin.readline()
print(line)
在上面的代码中,我们使用select.select方法监视标准输入,并在标准输入就绪时读取一行并打印到控制台。我们使用sys.stdin作为文件描述符列表,表示监视标准输入。我们使用空列表表示监视写和异常事件。
示例1:使用select模块实现简单的聊天室
以下是一个示例代码,用于使用select模块实现简单的聊天室:
import select
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8000))
server.listen(5)
inputs = [server]
outputs = []
while True:
r, w, e = select.select(inputs, outputs, [])
for sock in r:
if sock == server:
client, addr = server.accept()
inputs.append(client)
print('New client connected:', addr)
else:
data = sock.recv(1024)
if data:
for output in outputs:
output.send(data)
else:
inputs.remove(sock)
outputs.remove(sock)
sock.close()
在上面的代码中,我们使用select模块实现了一个简单的聊天室。我们使用socket库创建一个服务器,并使用select.select方法监视所有客户端的套接字。我们使用inputs列表存储所有套接字,包括服务器套接字和客户端套接字。我们使用outputs列表存储所有已连接的客户端套接字。当有新客户端连接时,我们将其添加到inputs列表中,并将其打印到控制台。当有客户端发送消息时,我们将消息发送给所有已连接的客户端。当客户端关闭连接时,我们将其从inputs和outputs列表中删除,并关闭套接字。
示例2:使用select模块实现异步HTTP请求
以下是一个示例代码,用于使用select模块实现异步HTTP请求:
import select
import socket
import time
urls = ['http://www.baidu.com', 'http://www.google.com', 'http://www.bing.com']
sockets = []
for url in urls:
host, path = url.split('/', 1)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setblocking(False)
try:
client.connect((host, 80))
except BlockingIOError:
pass
sockets.append(client)
while sockets:
r, w, e = select.select(sockets, sockets, sockets, 1)
for sock in r:
data = sock.recv(1024)
if data:
print(data)
else:
sockets.remove(sock)
for sock in w:
request = f'GET /{path} HTTP/1.0\r\nHost: {host}\r\n\r\n'
sock.send(request.encode())
sockets.remove(sock)
for sock in e:
sockets.remove(sock)
在上面的代码中,我们使用select模块实现了异步HTTP请求。我们使用socket库创建多个套接字,并使用select.select方法监视所有套接字。我们使用urls列表存储所有URL。我们使用sockets列表存储所有套接字。当套接字就绪时,我们发送HTTP请求并打印响应数据。当HTTP请求完成时,我们将套接字从sockets列表中删除。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解python中的select模块 - Python技术站