sleep() 在下面的代码中是如何工作的?

How sleep( ) works in the following code?

from __future__ import print_function

import sys
from time import sleep

fp = sys.stdout
print('Do you want to continue (Y/n): ', end='')
# fp.flush()
sleep(5)

我不知道我问的问题对不对。我在 Whosebug 上发现了许多类似的问题,但其中 none 很有用——它们缺乏细节。为什么在这种情况下 print 在执行 sleep 之后起作用?如果我取消注释 fp.flush() 然后 print 首先工作。为什么即使 printsleep 之前出现,也会发生这种情况?

问题中引用的代码演示了缓冲的效果。

首先,print 始终有效。

默认情况下,所有输出都将进入缓冲区。这是一个优化。

如果您 write/print 到终端,当缓冲区包含整行(即有换行符)时,缓冲区会自动刷新(即数据被发送到设备)。请注意,print 语句不会产生换行符,因此输出不会像往常一样出现在屏幕上。

还有其他情况会刷新缓冲区:当它已满时,当file/device关闭时,当程序退出时(因为所有打开的描述符都已关闭),当你用[请求它时=12=] 命令。该程序根据您对状态的注释或取消注释的方式显示最后两个的效果。

底层 C 库缓冲 stdout 以减少写入期间进行的系统调用次数。如果您 运行 来自终端的程序,stdout 是行缓冲的(它在看到换行符时发送数据)。如果将 stdout 通过管道传输到另一个程序或文件,它是块缓冲的,并且仅在写入某个长度(例如 4096 字节)时才发送数据。您可以手动将 stdout 设置为 RAW 以停止缓冲。

在您的程序中,您打印的消息没有换行符,因此在终端或管道模式下,它会在本地程序中进行缓冲。如果您取消注释 fd.flush()... ,则会立即将缓冲区刷新到操作系统中。睡眠对标准输出没有直接影响。当睡眠结束时,该文件会刷新到操作系统,从而在程序退出时刷新到您的屏幕。