在下面的代码中,sleep( )是如何工作的?[重复]

问题描述 投票:0回答:2
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)

我不知道我问的问题是否正确。我发现许多类似的问题 StackOverflow 但没有一个是有用的--他们缺乏细节。为什么 印制 后的作品 睡眠 在这种情况下执行?如果我取消对 fp.flush() 然后 印制 先工作。为什么会出现这种情况,即使在 印制 前有 睡眠?

python printing sleep flush
2个回答
0
投票

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

首先,在 print 始终有效。

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

如果你把writeeprint写到终端,当缓冲区包含一整行,即有一个换行符时,缓冲区会自动刷新(即数据被发送到设备)。注意 print 语句不会产生换行,所以输出不会像通常那样出现在屏幕上。

还有其他一些情况下缓冲区会被刷新:当缓冲区满了的时候,当文件设备被关闭的时候,当程序退出的时候(因为所有打开的描述符都被关闭了),当你用 flush 命令。程序显示了最后两个的效果,这取决于你如何注释或取消注释statememts。


1
投票

底层的C库对stdout进行缓冲,以减少写入过程中系统调用的次数。如果你从终端运行一个程序,stdout是行缓冲的(它在看到换行时发送数据)。如果你把stdout管道到另一个程序或文件,它是块缓冲的,只有在写了一定长度的数据,如4096字节时才会发送数据。您可以手动将stdout设置为RAW以停止缓冲。

在你的程序中,你打印一条没有换行的消息,所以在终端或管道模式下,它都会在本地程序中被缓冲。如果您取消了 fd.flush()...立即将缓冲区刷新到操作系统中。睡眠对stdout没有直接影响。当睡眠结束时,文件会被刷新到操作系统中,从而在程序退出时刷新到你的屏幕上。

© www.soinside.com 2019 - 2024. All rights reserved.