Почему http.server отвечает через две секунды?
Всем привет!
У меня есть максимально-упрощенный http.server для возврата статичного значения на GET-запрос. В случае с запросом через Postman на получения ответа уходит 2-4ms (примерно столько я и ожидаю получить), но в случае, если я отправляю запрос программно, через urllib.request.urlopen или requests.get ответ видно через две секунды. При этом почему-то всегда почти ровно две.
Мой вопрос: почему urllib.request.urlopen или requests.get отображает ответ с ощутимой задержкой? Ниже прилагаю упрощенный код и анализ его работы методом datetime.now().
Python 3.11
PS: мне говорили, что datetime не лучший способ замерять тайминги, но тут время, которое он выдает похоже на правду по ощущениям.
# Код 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() |
# Код 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()
# Код для проверки скорости ответа 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()}") |
# Код для проверки скорости ответа 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()}")
Результат исполнения проверки
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 сек между запросом и ответом |
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 :D :D
- Dimonchik, забавно получается)
Ответы:
Возможно клиент отправляет заголовок Expect: 100-continue, а сервер не умеет его обрабатывать
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Проблема с задержкой в ответе от http.server может быть вызвана несколькими причинами. Вот несколько возможных причин и способы их решения:
1. **Высокая загрузка сервера**: Если ваш сервер перегружен большим количеством запросов, это может привести к задержке в ответе. Для решения этой проблемы, вы можете попробовать увеличить ресурсы сервера или оптимизировать ваш код для уменьшения нагрузки.
2. **Сетевые проблемы**: Задержка в ответе также может быть вызвана проблемами с сетью, такими как низкая пропускная способность или нестабильное соединение. Попробуйте проверить ваше сетевое соединение и убедитесь, что оно работает корректно.
3. **Неэффективный код**: Если ваш код неоптимален, это также может привести к задержкам в ответе от сервера. Проверьте свой код на возможные узкие места и оптимизируйте его для улучшения производительности.
4. **Настройки сервера**: Некоторые настройки вашего сервера могут вызывать задержку в ответе. Проверьте конфигурацию сервера и убедитесь, что она настроена правильно для обработки запросов быстро и эффективно.
Вот пример использования http.server в Python с использованием модуля http.server:
import http.server import socketserver PORT = 8000 Handler = http.server.SimpleHTTPRequestHandler with socketserver.TCPServer(("", PORT), Handler) as httpd: print("serving at port", PORT) httpd.serve_forever()
Если проблема с задержкой в ответе сохраняется, рекомендуется провести дополнительное тестирование и анализ для выявления конкретной причины задержки.