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