1na1
@1na1
Hello, world!

Почему 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()


# Код для проверки скорости ответа 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 сек между запросом и ответом


Пример из Postman, который тот же запрос выполняет в ожидаемое время:

653f795d0a117327768698.png
  • Вопрос задан
  • 2424 просмотра
Решения вопроса 1
dimonchik2013
@dimonchik2013
non progredi est regredi
SERVER_ADDRESS = 'localhost'
меняешь на
SERVER_ADDRESS = '127.0.0.1'

объяснять нужно? и вооьбще - какую проблему решаем-то?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ivan_Pinezhaninov
@Ivan_Pinezhaninov
C++/Qt developer
Возможно клиент отправляет заголовок Expect: 100-continue, а сервер не умеет его обрабатывать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
02 мая 2024, в 14:44
500 руб./за проект
02 мая 2024, в 14:36
3000 руб./за проект
02 мая 2024, в 14:29
30000 руб./за проект