В Python, как работает очистка и в чем причина?
У меня есть небольшая многопоточная программа, включая оператор печати. Это отлично работает, если я не изменил 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 ответ
Когда вы печатаете на Python и используете в качестве последнего символа запятую (не как символ, а как знак разделения), вывод не сбрасывается, потому что он ожидает другого оператора печати. Это функция запятой в команде печати. Если вы не добавите запятую в команду печати, она должна очиститься и создать новую строку в процессе, фактически наоборот, она создаст новую строку и, следовательно, сбросит.
print(task.get(), end=',')
Будет печатать без новой строки и ждет следующей печати, которая создаст новую строку, прежде чем очистить буфер.
print(task.get())
print(task.get(), end='\n') # works well
Напечатает что-то, включая новую строку, и очистит буфер.
Это очень распространенная практика во многих консольных выходных приложениях, точно такое же поведение, которое вы получаете с C и C++. Новая строка используется как знак для буфера, чтобы очистить, если буфер будет очищаться после каждого символа, он будет использовать слишком много процессора.
print(task.get(), end=',', flush=True)
Вышесказанное работает, потому что мы явно говорим очистить буфер. Не будет новой строки, но оператор print очистит буфер и сразу же напечатает.