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

时间:2016-01-30 09:03:00

标签: python printing buffer flush

我有一个小的多线程程序,包括print语句。 如果我没有将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()

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

这在许多控制台输出应用程序中非常常见,与C和C ++完全相同。换行符用作缓冲区清空的符号,如果缓冲区在每个字符后都会清空它会占用过多的cpu。

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

以上是有效的,因为我们明确地说要刷新缓冲区。没有换行符,但print语句将刷新缓冲区并立即打印。