python - Werkzeug 响应太慢

标签 python apache mod-wsgi httpresponse werkzeug

我有以下用于将文件返回给客户端的 Werkzeug 应用程序:

from werkzeug.wrappers import Request, Response

@Request.application
def application(request):    
    fileObj = file(r'C:\test.pdf','rb')
    response = Response( response=fileObj.read() )
    response.headers['content-type'] = 'application/pdf'
    return response

我想重点说的是这一部分:

response = Response( response=fileObj.read() )

在这种情况下,响应大约需要 500 毫秒(C:\test.pdf 是一个 4 MB 的文件。网络服务器在我的本地机器上)。

但如果我将那行重写为:

response = Response()
response.response = fileObj

现在响应大约需要 1500 毫秒。 (慢 3 倍)

如果这样写:

response = Response()
response.response = fileObj.read()

现在响应大约需要 80 秒(没错,80 秒)。

为什么这3种方法有这么大的区别?
为什么第三种方法这么慢?

最佳答案

答案很简单:

  • x.read() <- 将整个文件读入内存,效率低下
  • 设置对文件的响应:非常低效,因为该对象的协议(protocol)是一个迭代器。因此,您将逐行发送文件。如果它是二进制的,您将以随机 block 大小发送它。
  • response 设置为字符串:坏主意。如前所述,它是一个迭代器,因此您现在将字符串中的每个字符作为一个单独的数据包发送。

正确的解决方案是将文件包装在WSGI服务器提供的文件包装器中:

from werkzeug.wsgi import wrap_file
return Response(wrap_file(environ, yourfile), direct_passthrough=True)

direct_passthrough 标志是必需的,这样响应对象就不会尝试遍历文件包装器,而是让 WSGI 服务器保持原样。

关于python - Werkzeug 响应太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16780731/

相关文章:

python - Eclipse 找不到运行 python 代码的 libnppc.so.7.0 库,其中包含使用 CUDA 库的 Opencv 命令

python - 存储增量数字的最佳方式?

python - ValueError : Error when checking target: expected dense_13 to have shape (None, 6) 但得到形状为 (6, 1) 的数组

java - 通过 AJP 将远程用户传递给 tomcat

python - Ubuntu : Unable to correct problems, 你有损坏的包

python - Flask 和 mod_wsgi 导入错误

python - 如何在 Python 中实现 Softmax 函数

MySQL 未启动

django - Django + Django Rest Framework + mod_wsgi 内存泄漏

linux - 在apache中将虚拟目录设置为root