Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Werkzeug响应太慢_Python_Apache_Mod Wsgi_Httpresponse_Werkzeug - Fatal编程技术网

Python Werkzeug响应太慢

Python Werkzeug响应太慢,python,apache,mod-wsgi,httpresponse,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-t

我有以下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的文件。Web服务器在我的本地计算机中)

但如果我把这句话改写成这样:

response = Response()
response.response = fileObj
现在,响应大约需要1500毫秒(慢3倍)

如果这样写:

response = Response()
response.response = fileObj.read()
现在,响应大约需要80秒(没错,80秒)

为什么这三种方法之间有这么大的差异?

第三种方法为什么这么慢?

我不能给你一个确切的答案,解释为什么会发生这种情况,但是可能有助于解决你的下属问题。

答案很简单:


  • x.read()
    经过一些测试,我想我已经找到了答案

    @Armin已经解释了为什么

    response = Response()
    response.response = fileObj.read()
    
    response = Response( response=fileObj.read() )
    
    …太慢了。但这并不能解释为什么

    response = Response()
    response.response = fileObj.read()
    
    response = Response( response=fileObj.read() )
    
    …太快了。它们看起来是一样的,但显然不是。否则就不会有速度上的巨大差异

    这里的关键在于文档的这一部分:

    响应可以是任何类型的iterable或string。如果它是一个字符串,则认为它是一个iterable,其中一项是传递的字符串

    i、 当你给构造函数一个字符串时,它被转换成一个iterable,字符串是它唯一的元素。但是当您这样做时:
    response.response=fileObj.read()
    ,字符串将按原样处理

    因此,要使其行为类似于构造函数,必须执行以下操作:

    response.response = [ fileObj.read() ]
    

    现在文件被尽可能快地发送。

    我展示的第一种方法:
    Response(Response=fileObj.read())
    将响应设置为字符串,只需500毫秒。这对我来说似乎相当快。