gpt4 book ai didi

python - gevent.http.HTTPServer API 建议流式传输,而是缓冲整个请求和响应

转载 作者:太空狗 更新时间:2023-10-29 21:59:55 28 4
gpt4 key购买 nike

gevent.http.HTTPServer 提供的 API 似乎支持双向流。请求对象不提供请求主体作为一个简单的字符串,而是提供一个 .input_buffer 属性,它是 Python 可迭代的,而在另一个方向上,响应的数据可以作为 block 传递三个调用:

request.send_reply_start(200, 'OK')
request.send_reply_chunk(...) # as many times as you wish
request.send_reply_end()

但我一定是配置错误了,因为尽管有这个非常棒的无缓冲 API,我的请求处理程序直到 last 请求 POST 数据 block 最终到达时才被调用,并且在另一个方向上在服务器到达 .send_reply_end() 之前,我没有看到任何 header 到达我的客户端套接字。是否有一些我必须抛出的开关或我必须操纵的一些配置设置才能关闭缓冲并在请求到达时查看请求和发送响应,例如 gevent 通过其 StreamServer 支持原始套接字?

我的应用程序需要支持可能大于 RAM 的单个文件上传和下载,这将需要关闭此缓冲。

这是一个用 gevent 编写的简单服务器和客户端,应该向您显示此行为:

# srv.py

import gevent.http

M100 = 100 * 1024 * 1024

def main():
print 'Serving on 8088...'
gevent.http.HTTPServer(('0.0.0.0', 8088), handle).serve_forever()

def handle(request):
print 'Is request chunked?', request.chunked
for item in request.input_buffer:
print 'received body segment of length', len(item), 'bytes'
request.add_output_header('Content-Type', 'application/octet-stream')
request.send_reply_start(200, 'OK')
for i in range(5):
print 'sending chunk', i
request.send_reply_chunk(M100 * 'x')
request.send_reply_end()

if __name__ == '__main__':
main()

和:

# cli.py

import requests
import time

M100 = 100 * 1024 * 1024

def gen():
for i in range(5):
print 'sending chunk', i
yield M100 * 'x'
time.sleep(1)

if __name__ == '__main__':
r = requests.post('http://localhost:8088/', data=gen(), stream=True)
for block in r.iter_content(M100):
print 'received', len(block), 'bytes from download'

感谢您的指导!

最佳答案

对服务器的请求:查看源代码,似乎在请求完成之前不会调用服务器的处理函数,无论它是否以分 block 方式发送。所以你在那里运气不好。

服务器响应:服务器响应可以以流方式发送,但您需要在处理程序线程中自愿放弃控制才能使其正常工作(例如,通过在每个 block 之后调用 gevent.sleep()) .

不幸的是,gevent似乎没有提供在开始下一个 block 之前等待给定 block 完成发送的方法,因此如果生成数据的速度快于发送数据的速度,则可能会遇到内存问题。


注意以上信息引用gevent<1.0 ,它使用 libevent库,不适用于更新版本的 gevent .当前版本gevent不再包含 http模块,所以这个问题没有实际意义。

关于python - gevent.http.HTTPServer API 建议流式传输,而是缓冲整个请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14752690/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com