在以下环境下:Apache->mod\wsgi->python->werkzeug
我如何控制是否使用httpckunking以及块有多大?在
跟进:
我担心的是这两者之间的区别:
response = werkzeug.wrappers.Response()
response.response = very_long_string
return response
还有这个:
^{pr2}$在第一种情况下,werkzeug遍历字符串,一次发送一个字符。我不知道是否每个字符都是在自己的块中发送的,但我知道这比第二种情况下字符串作为一个整体发送要慢得多。在
这两个案例的速度差异是不是因为分块?或者是别的什么?在
一般来说,wsgi指定只要应用程序生成响应内容的任何部分,就应该将数据发送到客户端,而不进行缓冲;例如,如果您这样做了:
值得注意的是,如果没有
Content-Length
报头,网关(在您的例子中是apache/mod_wsgi)无法猜测它已经找到了所有的响应内容,而且由于不允许缓冲,它必须使用分块传输编码。在另一方面,考虑:
^{pr2}$由于应用程序指定了内容长度,并且由于第一个
yield
ed块正好是这个长度,网关知道不会有更多的数据;它可以使用也可以不使用分块编码,这是由它自己决定的。同样通常不会导致分块;响应是一个列表,其大小有界,因此网关知道它有整个响应。它甚至可以使用
sum(map(len, app_iter))
从应用程序中找到内容长度,然后以网络允许的速度发送响应。在至于控制块有多大,如果客户端连接被阻止,网关可能会缓冲块;你的应用可能会
但是,如果客户端连接在处理“foo”块时阻塞,网关可能会将bar和baz缓冲在一起,在连接准备好再次读取时将它们作为单个块发送。简而言之,你不能控制分块,你可以强迫它发生,你可以经常阻止它的发生(如果不需要的话,大多数网关就不会分块);但是它不适合于分帧。在
相关问题 更多 >
编程相关推荐