lush() 方法指示流实际将输出发送到流管道中。
由于各种性能原因,各种流实现可以缓存输出,而不是立即写入底层流。
例如,将 IO 操作保存在磁盘上,从性能角度来看,这非常昂贵。
如果不是为了性能,刷新流是没有问题的,在本例中这正是您想要的:在您刷新它之前,流似乎会被卡住,因此您希望它实际将内容发送到客户端。
也许您可以调整缓冲区的大小(大于 1024),看看哪个更适合。
EDIT :
在循环中或不在循环中刷新的问题相对不相关。
您可以随时调用flush,正如所说的那样,它将调用底层操作系统流,这是否会影响性能取决于具体情况。
例如,您可以认为流缓冲文件的 200MB RAM 比 IO 操作更重要,而且在性能方面也是如此。
或者更简单地说,重视看到文件实际下载的用户体验比您可能遇到的最终性能影响更重要(如果您设法衡量它)。
如前所述,缓冲区越大,循环问题就越少。作为一个极端的例子,假设您的缓冲区为 100 MB,那么 80 MB 的文件将仅获得一次刷新,无论如何它都会在请求结束时获得。
1k 的缓冲区可能太小,4k 更好,16k 更好,这是 IO 调用和 RAM 消耗之间的权衡。
流本身应该做正确的工作,但是如果您看到 200MB 文件被完全缓存,除非您调用刷新,那么显然流可能正在优化性能,但提供了糟糕的用户体验,所以显然您需要在循环中使用它。