Всем привет!
У меня есть максимально-упрощенный http.server для возврата статичного значения на GET-запрос. В случае с запросом через Postman на получения ответа уходит 2-4ms (примерно столько я и ожидаю получить), но в случае, если я отправляю запрос программно, через urllib.request.urlopen или requests.get ответ видно через две секунды. При этом почему-то всегда почти ровно две.
Мой вопрос: почему urllib.request.urlopen или requests.get отображает ответ с ощутимой задержкой? Ниже прилагаю упрощенный код и анализ его работы методом datetime.now().
Python 3.11
PS: мне говорили, что datetime не лучший способ замерять тайминги, но тут время, которое он выдает похоже на правду по ощущениям.
|
1 |
# Код http.server, который будет запущен и вызываться через Postman, urllib.request.urlopen и requests.get from http.server import BaseHTTPRequestHandler, HTTPServer SERVER_ADDRESS = 'localhost' PORT = 4242 class HttpSpec(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() self.wfile.write(b"{}") # Тут должен быть JSON побольше, пустой для упрощения server = HTTPServer((SERVER_ADDRESS, PORT), HttpSpec) try: server.serve_forever() except KeyboardInterrupt: pass server.server_close() |
|
1 |
# Код для проверки скорости ответа urllib.request.urlopen и requests.get. Ощущение, что дело не в них from datetime import datetime from urllib.request import urlopen from requests import get print(f"begin urllib.request.urlopen {datetime.now()}") urlopen('http://localhost:4242') print(f" end urllib.request.urlopen {datetime.now()}") print() print(f"begin requests.get {datetime.now()}") get('http://localhost:4242') print(f" end requests.get {datetime.now()}") |
Результат исполнения проверки
|
1 |
begin urllib.request.urlopen 2023-10-30 11:25:41.373944 end urllib.request.urlopen 2023-10-30 11:25:43.435204 # 2 сек между запросом и ответом begin requests.get 2023-10-30 11:25:43.435204 end requests.get 2023-10-30 11:25:45.485125 # 2 сек между запросом и ответом |
Пример из Postman, который тот же запрос выполняет в ожидаемое время:
Дополнительно:
Содержание
SERVER_ADDRESS = 'localhost'
меняешь на
SERVER_ADDRESS = '127.0.0.1'
объяснять нужно? и вооьбще - какую проблему решаем-то?
- Можете объяснить? Не совсем понимаю почему
- Shandy, DNS Resolv
сюда сайтец закинь любой, узнаешь что это такое
https://ping-admin.com/free_test/ - Dimonchik, так он же в hosts прописан по идее, почему 2 секунды?
- Это помогло, спасибо большое!
Желательно правда объяснить или сказать что читать. Почему Postman не ждёт DNS?
В общем побежал гуглить, мне в голову не приходило, что localhost может резолвиться две секунды)
-
Почему Postman не ждёт DNS?
мухлюет
сразу обращается по IPдумаю можно поймать заменив в хостс локалхост на что=то удаленное, но может и нет )
- Shandy,
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhostпрописан но
ЗАКОММЕНТИРОВАН :D 😀 😀
- Dimonchik, забавно получается)
Ответы:
Возможно клиент отправляет заголовок Expect: 100-continue, а сервер не умеет его обрабатывать
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?

Проблема с задержкой в ответе от http.server может быть вызвана несколькими причинами. Вот несколько возможных причин и способы их решения:
1. **Высокая загрузка сервера**: Если ваш сервер перегружен большим количеством запросов, это может привести к задержке в ответе. Для решения этой проблемы, вы можете попробовать увеличить ресурсы сервера или оптимизировать ваш код для уменьшения нагрузки.
2. **Сетевые проблемы**: Задержка в ответе также может быть вызвана проблемами с сетью, такими как низкая пропускная способность или нестабильное соединение. Попробуйте проверить ваше сетевое соединение и убедитесь, что оно работает корректно.
3. **Неэффективный код**: Если ваш код неоптимален, это также может привести к задержкам в ответе от сервера. Проверьте свой код на возможные узкие места и оптимизируйте его для улучшения производительности.
4. **Настройки сервера**: Некоторые настройки вашего сервера могут вызывать задержку в ответе. Проверьте конфигурацию сервера и убедитесь, что она настроена правильно для обработки запросов быстро и эффективно.
Вот пример использования http.server в Python с использованием модуля http.server:
Если проблема с задержкой в ответе сохраняется, рекомендуется провести дополнительное тестирование и анализ для выявления конкретной причины задержки.