你可能想要像select.select()(见
documentation)。您提供select()和三个套接字列表:要监视的可用性,可写性和错误状态的套接字。当新客户端等待时,服务器套接字将可读。
select()函数将阻塞,直到其中一个套接字状态发生更改。如果不想永久阻止,可以指定可选的第四个参数timeout。
这里是一个愚蠢的回声服务器示例:
import select
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', 8888))
server_socket.listen(5)
print "Listening on port 8888"
read_list = [server_socket]
while True:
readable, writable, errored = select.select(read_list, [], [])
for s in readable:
if s is server_socket:
client_socket, address = server_socket.accept()
read_list.append(client_socket)
print "Connection from", address
else:
data = s.recv(1024)
if data:
s.send(data)
else:
s.close()
read_list.remove(s)
对于支持它们的平台,Python还具有epoll,poll和kqueue实现。它们是选择的更有效的版本。