В 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 очистит буфер и сразу же напечатает.

Другие вопросы по тегам