【问题标题】:In Python, how does flushing work and what is the reason?在 Python 中,flush 是如何工作的,原因是什么?
【发布时间】:2016-01-30 09:02:59
【问题描述】:

我有一个包含打印语句的小型多线程程序。 如果我没有将end 更改为除\n 之外的其他字符,它会完美运行。 如果我想使用其他字符而不是\n,我需要将flush 设置为True

所以我的问题是冲洗是如何工作的,原因是什么?

#!/usr/bin/env python -u
# -*- coding: utf-8 -*-
from threading import Thread
from queue import Queue
from time import sleep


def do_stuff(task):
    while not task.empty():
        sleep(1)
        print(task.get())  # works well
        # print(task.get(), end='\n')  # works well
        # print(task.get(), end=',', flush=True)  # works well
        # print(task.get(), end=',')  # works badly
        task.task_done()


q = Queue(maxsize=0)
for x in range(0, 5):
    q.put(x)

num_threads = 2

for i in range(num_threads):
    worker = Thread(target=do_stuff, args=(q,))
    worker.setDaemon(True)
    worker.start()

q.join()

【问题讨论】:

    标签: python printing buffer flush


    【解决方案1】:

    当您在 Python 中打印并使用逗号作为最后一个字符(不是作为字符而是作为分隔符)时,输出不会被刷新,因为它正在等待另一个打印语句。这是打印命令中逗号的作用。如果您不将逗号添加到打印命令中,它应该刷新并在该过程中创建一个新行,实际上相反,它会创建一个换行符并因此刷新。

        print(task.get(), end=',') 
    

    将在没有换行符的情况下打印,并在刷新缓冲区之前等待下一个将创建新行的打印。

     print(task.get())  
     print(task.get(), end='\n')  # works well
    

    将打印包括新行在内的内容并刷新缓冲区。

    这在许多控制台输出应用程序中非常常见,与 C 和 C++ 的行为完全相同。换行符用作缓冲区清空的标志,如果缓冲区在每个字符后清空,则会消耗过多的 CPU。

     print(task.get(), end=',', flush=True) 
    

    上面的工作是因为我们明确地说要刷新缓冲区。不会有换行符,但 print 语句会刷新缓冲区并因此立即打印。

    【讨论】:

    • 你的答案有点以 Py2 为中心,而 OP 的代码是 Py3。
    • @BrianO 啊啊我错过了这一点。那么参数是相同的,只是函数调用不同..让我更新答案
    • 换句话说,任何时候 end 都等于新行以外的任何内容,我们应该使用 flush=True ?
    • @EsdrasLopez 如果您想立即输出文本,是的,如果您不在乎稍后打印,则不。
    • @EsdrasLopez 我几乎总是会说,大多数情况下,您想要打印的内容是否在一秒钟后出现在屏幕上并不重要。对于多个并行进程,它通常很重要,因为您希望它以特定顺序打印。
    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2012-12-15
    • 2011-10-13
    • 2017-04-10
    • 2010-10-21
    • 2010-12-04
    相关资源
    最近更新 更多