Многопоточность и перезапись предыдущего print'а каждого потока
Есть два потока выполняющиеся одновременно, оба обрабатывают строки в разных файлах независимо друг от друга. С каждого потока вывожу информацию :
print("Первый обработал " + row + " строк")
Пытаюсь исправить добавление новой строки на изменение предыдущей:
print("Первый обработал " + row + " строк", end = "r", flush = True)
но в таком случае оба потока меняют принты друг друга, есть возможность сделать так, что бы каждый поток изменял только "свой" принт, получая на выходе что - то типа:
Первый поток обработал ХХХ строк
Второй поток обработал ХХХ строй
Ответы (3 шт):
Воспользуйтесь модулем blessings.
Пример из документации:
from blessings import Terminal
t = Terminal()
print t.bold('Hi there!')
print t.bold_red_on_bright_green('It hurts my eyes!')
with t.location(0, t.height - 1):
print 'This is at the bottom.'
В две строки надо подумать, но в одну строчку достаточно просто сделать с помощью print() и возврата каретки через \r, как у Вас указано, но должно быть \r.
В итоге можно сделать с двух потоков итоговую строку, и она будет обновляться с определенным интервалом по времени.
import time
for i in range(10):
a = i
b = i * 100
print(f'thread 1 = {a}, thread 2 = {b}', end='\r', flush=True)
time.sleep(1)
Запускать через терминал.
Если же в две строки, то можно с очисткой окна терминала тот же самый вариант прокрутить
import os
import time
for i in range(10):
a = i
b = i * 100
os.system('clear')
print(f'thread 1 = {a}\nthread 2 = {b}', end='\n', flush=True)
time.sleep(1)
Используя ESC-последовательности, можно прыгать по строчкам.
Вот простая реализация, где строка вывода привязана к номеру потока, после выполнения вывода курсор перемещается на "базовую" строку. Сделал в виде прогрессбара, изменить формат вывода не составит труда.
import time
from random import random
from threading import Thread, Lock
from functools import partial
THREADS_COUNT = 5
NEED_STR = THREADS_COUNT + 1
print('\n' * NEED_STR, end=f"\x1b[{NEED_STR}F") # на случай, если на момент запуска не хватает строк терминала
print = partial(print, end='\r', flush=True)
plock = Lock()
def lprint(s, n):
with plock:
print(f"\x1b[{n}E") # перемещаемся вниз на n строк
print(f"\t{s}") # печатаем
print(f"\x1b[{n}F") # возвращаемся назад на n строк
def work(n, slow_down):
lprint(f"thread {n}:", n)
for i in range(20):
time.sleep(slow_down)
lprint(f"thread {n}: {'█' * i}", n)
lprint(f"thread {n}: {'█' * i} finished!", n)
threads = []
print('Progress:')
for i in range(1, THREADS_COUNT + 1):
t = Thread(target=work, args=(i, random()))
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"\x1b[{len(threads)}E", end='\n') # чтобы не затирался весь вывод после завершения программы