Ответ 1
Вы, вероятно, хотите что-то вроде select.select()
(см. Документацию). Вы предоставляете 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
для платформ, которые их поддерживают. Они являются более эффективными вариантами select
.