Бутылка, возвращающая ответы очень медленно - PullRequest
0 голосов
/ 14 января 2019

Я создал 2 разных способа возврата из одной из моих функций, оформленных по маршруту:

Метод 1:

return HTTPResponse(status=200, body=myBody)

Метод 2 (Это сделано для того, чтобы ловушка after_request могла сейчас прочитать тот же объект ответа):

response = bottle.response.copy()
response.status = 200
response.body = myBody
return response

myBody - это строка, а не dict (наша вышестоящая библиотека уже преобразует dict в строку через json.dumps ()), а myBody также велика: это словарь с 1 ключом, но список из 600+ членов как значение.

Моя проблема: Метод 1 очень быстро возвращается вызывающему клиенту (клиент использует библиотеку запросов через POST-запрос).

Метод 2 примерно в 10 раз медленнее (вызывающий клиент ждет ответа около 2 минут, по сравнению с 2 секундами в методе 1).

Я также отключил любую after_hook логику, просто чтобы изолировать любые другие эффекты.

Любой намек на то, что может быть основной причиной?

1 Ответ

0 голосов
/ 14 января 2019

Самый эффективный (самый быстрый) способ вернуть вашу большую строку - просто вернуть итерацию. Например.,

return [myBody]

В частности: (1) не копируйте объект ответа, и (2) 200 является кодом ответа по умолчанию, поэтому указывать его не нужно.


В: Почему я возвращаю список (содержащий одну строку), а не просто строку?

A: Мы могли бы return myBody, но return [myBody] предпочтительнее. Вот почему :

Приложения должны возвращать итерируемые строки выходных байтов. Вы можете вернуть строку (потому что строки являются итеративными), но это заставляет большинство серверов передавать ваш контент char за символом.

...