在Python中,刷新是如何工作的,原因是什么?

在Python中,刷新是如何工作的,原因是什么?,python,printing,buffer,flush,Python,Printing,Buffer,Flush,我有一个小的多线程程序,包括打印语句。 如果我没有将结束更改为除\n以外的其他字符,那么它将非常有效。 如果我想使用其他字符而不是\n,我需要将刷新设置为真 所以我的问题是法拉盛是如何运作的,原因是什么 #!/usr/bin/env python -u # -*- coding: utf-8 -*- from threading import Thread from queue import Queue from time import sleep def do_stuff(task):

我有一个小的多线程程序,包括打印语句。 如果我没有将
结束
更改为除
\n
以外的其他字符,那么它将非常有效。 如果我想使用其他字符而不是
\n
,我需要将
刷新设置为

所以我的问题是法拉盛是如何运作的,原因是什么

#!/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中打印并使用逗号作为最后一个字符(不是字符而是分隔符)时,输出不会被刷新,因为它正在等待另一个print语句。这是打印命令中逗号的功能。如果不在print命令中添加逗号,它将在过程中刷新并创建新行,实际上相反,它将创建新行并进行刷新

    print(task.get(), end=',') 
将在不使用换行符的情况下打印,并在刷新缓冲区之前等待下一次创建新行的打印

 print(task.get())  
 print(task.get(), end='\n')  # works well
将打印包含新行的内容并刷新缓冲区

 print(task.get())  
 print(task.get(), end='\n')  # works well
<>这是很多控制台输出应用程序中非常常见的做法,与C和C++的行为完全相同。换行符用作缓冲区清空的标志,如果缓冲区在每个字符后清空,则会消耗太多cpu

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

上述方法之所以有效,是因为我们明确表示要刷新缓冲区。不会有换行符,但print语句会刷新缓冲区,因此会立即打印。

您的答案有点以Py2为中心,而OP的代码是Py3。@BrianO aaah我错过了这一点。参数相同,只是函数调用不同。。让我更新答案换句话说,任何时候结束都等于除新行之外的任何内容,我们应该使用flush=True?@EsdrasLopez如果你想立即输出文本是的,如果你不太在乎以后是否打印,不@EsdrasLopez我几乎总是这么说,大多数情况下,您想要打印的内容是否会在第二秒后出现在屏幕上并不重要。对于多个并行进程,它通常很重要,因为您希望它以特定的顺序打印。