Python Как ждать 5 секунд? - PullRequest
0 голосов
/ 25 марта 2020

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

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

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

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

1 Ответ

0 голосов
/ 25 марта 2020

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

В любом случае, учитывая ваше описание, я думаю, используя неблокирующие сокеты и выбор циклов ( 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 в данном случае - это порт, к которому привязан сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...