Подтвердить что ты не робот

Python socket.accept неблокируется?

Есть ли способ использовать python socket.accept() неблокирующим способом, который просто запускает его и позволяет мне просто проверить, есть ли у него какие-либо новые соединения? Я действительно не хочу использовать потоки. Спасибо.

4b9b3361

Ответ 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.