Почему http.server отвечает через две секунды?

Ссылка скопирована
1 ответ

Всем привет!

У меня есть максимально-упрощенный 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, который тот же запрос выполняет в ожидаемое время:

Почему http.server отвечает через две секунды?

Дополнительно:

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, а сервер не умеет его обрабатывать

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Проблема с задержкой в ответе от 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()

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()

Если проблема с задержкой в ответе сохраняется, рекомендуется провести дополнительное тестирование и анализ для выявления конкретной причины задержки.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно