我已经创建了两种从路由装饰函数之一返回的方法:
方法1:
return HTTPResponse(status=200, body=myBody)
方法2(这样做是为了使after_request挂钩现在可以读取相同的响应对象。):
response = bottle.response.copy()
response.status = 200
response.body = myBody
return response
myBody是一个字符串,而不是字典(我们的上游库已经通过json.dumps()将字典转换为字符串),而且myBody也很大:它是一本有1个键的字典,但有600多个成员列表作为值。
我的问题是: 方法1非常快速地返回到调用方客户端(客户端通过POST请求使用请求库)。
方法2的速度要慢大约10倍(呼叫客户端等待大约2分钟才能获得响应,而方法1则为2秒)。
我也已禁用任何after_hook
逻辑,只是为了隔离其他任何影响。
关于什么可能是根本原因的任何提示?
答案 0 :(得分:1)
返回大字符串的最有效(最快)方法是简单地返回一个可迭代对象。例如,
return [myBody]
特别是:(1)不要复制响应对象,并且(2)200是默认的响应代码,因此无需指定它。
问:为什么我返回一个列表(包含单个字符串)而不是仅返回字符串?
A:我们可以return myBody
,但首选return [myBody]
。 Here's why:
应用程序必须返回可迭代的屈服字节字符串。您可能会返回一个字符串(因为字符串是可迭代的),但这会导致大多数服务器逐个char传输内容。