Python Как ждать 5 секунд?

Я занимаюсь программированием сокетов на Python и отправляю запросы на несколько серверов.

Мне нужно подождать 5 секунд, чтобы сервер ответил на этот запрос. Если я не получу ответ в течение 5 секунд, я отправлю этот же запрос на другой сервер.

Как мне запустить таймер на 5 секунд, когда он истечет, выполнить код внизу? (при условии, что я не получаю ответ)

Будет ли sleep (5) работать в этой ситуации, как если бы я получил ответ до 5 секунд, он все еще будет ждать 5 секунд? Если это так, я не хочу его использовать.

Всего 1 ответ


Хорошая вещь в программировании сокетов заключается в том, что вы можете делать все, что захотите, и есть много вещей, чтобы найти решение для данной проблемы. Это также очень плохо в программировании сокетов ...

В любом случае, учитывая ваше описание, я думаю, что использование неблокирующих сокетов и циклов выбора ( wikipedia , python docs ) вполне подойдет.

Вот фрагмент кода того, как это работает, используя UDP-сокет для связи с вашим сервером, будет похоже на TCP.

<!-- language: «Python» -->
import socket
import select

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.setblocking(0)

# Optional bind the socket to a local port
udp_socket.bind(('', 6666))

# send your request
....
# wait for an answer AT MOST X seconds
readable, _, _ = select.select([udp_socket], [], [], 5) # X is 5 in this case as you requested

# At this point either 5 seconds would have passed or your socket would have some information (response) in it earlier than the 5 seconds

if readable: # check if socket received a response
    response = readable[0].recv(1024)

Вы можете проверить, работает ли он, подделав ответ сервера, отправив что-то в свой сокет, пока select ожидает. Вы можете сделать это, отправив с помощью / dev / udp. Для этого используйте:

echo "data" > /dev/udp/127.0.0.1/6666

Где в этом случае 6666 - это порт, к которому привязан сокет.


Есть идеи?

10000