Есть ли способ использовать python socket.accept() неблокирующим способом, который просто запускает его и позволяет мне просто проверить, есть ли у него какие-либо новые соединения? Я действительно не хочу использовать потоки. Спасибо.
Python socket.accept неблокируется?
Ответ 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
.
Ответ 2
Вы можете вызвать метод setblocking(0)
на Socket, чтобы сделать его неблокирующим. Посмотрите асинхронный модуль или фреймворк вроде Twisted.