python select 非阻塞
时间: 2023-10-16 18:09:54 浏览: 42
Python的select模块提供了一个非阻塞的IO多路复用机制。使用select可以同时监听多个文件描述符(如套接字),一旦其中任何一个文件描述符变为就绪状态,就可以进行读或写操作。
下面是一个简单的非阻塞select示例:
```python
import socket
import select
# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 8080))
server_socket.listen()
# 将socket对象添加到select中
inputs = [server_socket]
while True:
# 监听所有的inputs
readable, _, _ = select.select(inputs, [], [])
# 循环处理所有就绪的inputs
for sock in readable:
if sock is server_socket:
# 有新的客户端连接进来
client_socket, address = server_socket.accept()
inputs.append(client_socket)
print(f'Connected by {address}')
else:
# 从客户端读取数据
data = sock.recv(1024)
if data:
print(data.decode('utf-8'))
else:
# 客户端关闭了连接,移除socket对象
inputs.remove(sock)
sock.close()
```
在上面的代码中,我们使用select监听所有的inputs,一旦其中任何一个socket对象变为就绪状态,就会进入对应的if分支进行处理。如果是server_socket就说明有新的客户端连接进来,我们需要接受连接并将新的client_socket添加到inputs中;如果是client_socket就说明有数据可读,我们需要读取数据并进行处理;如果是其他类型的socket对象就不做任何处理。
需要注意的是,使用select进行非阻塞IO编程时,需要手动管理inputs列表中的socket对象,包括添加、移除等操作。