使用BaseHTTPRequestHandler时rfile.read()为何会延迟执行?
BaseHTTPRequestHandler时rfile.read()为何会延迟执行?
嘿,这个问题我太懂了,我来给你掰扯清楚:
核心原因就是不带参数的rfile.read()会一直等待输入流结束,而HTTP持久连接下这个流不会立刻关闭。
你想啊,HTTP/1.1默认是开启Keep-Alive的,客户端发完POST请求之后,不会马上断开和服务器的连接,而是会保持连接以便后续复用。这时候服务器端的rfile(也就是请求体的输入流)就会一直处于等待状态,它觉得“说不定客户端还会发更多数据过来?”,直到下一个POST请求过来,或者客户端主动断开连接,它才会认为“哦,流结束了”,这时候才会把读到的内容返回给你,所以你才会看到延迟的情况。
那为什么带了content_len参数就正常了呢?
这就回到HTTP协议的规范上了——POST请求的请求体大小,客户端是通过Content-Length请求头告诉服务器的。当你调用rfile.read(content_len)时,你明确告诉了程序:“就读这么多字节就行”,程序读完指定长度的内容就立刻返回,根本不需要等流结束,所以在单个POST请求里就能马上拿到数据并打印,完全符合你的预期。
再对照你的两段代码看:
- 第一段代码里,你直接调用
self.rfile.read(),没给参数,它就死等流关闭,而持久连接下连接不会马上断,所以就卡着不动; - 第二段代码里,你先正确获取了
Content-Length的数值,传给read(),它读完对应长度就停止,自然就正常执行了。
其实BaseHTTPRequestHandler的设计逻辑就是期望你按照HTTP规范,通过Content-Length来读取请求体的,这也是处理POST请求的标准做法哦。
备注:内容来源于stack exchange,提问作者Schrey
相关产品推荐
相关产品推荐

