我有一个小的多线程程序,包括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()
答案 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语句将刷新缓冲区并立即打印。