Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 4, 2015 19:44:52

Chocobo
Зарегистрирован: 2014-10-07
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

Добрый день!

Есть в скрипте команда, которая выполняется ощутимо долгое время.
Как сделать так, чтоб в процессе ее выполнения выводить какой-нибудь индикатор прогресса, что скрипт сейчас активно занят той строчкой?

Какие нибудь “бегающие звездочки” или “вертящаяся линия” и т.д.

Офлайн

#2 Окт. 4, 2015 20:32:58

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

Команда какого типа ? Цикл, запрос к базе, сетевая задержка ?

Офлайн

#3 Окт. 4, 2015 21:03:04

Chocobo
Зарегистрирован: 2014-10-07
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

команда - обращение к ОС и не подразумевает итераций, поэтому о прогрессбаре речи не идет, собственно сама команда:

emerge_out = commands.getoutput("emerge system -uDNvp")

Отредактировано Chocobo (Окт. 4, 2015 21:14:21)

Офлайн

#4 Окт. 5, 2015 02:42:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

Надо сделать второй поток, который дожидается признака выполнения команды и выводит прогресс.



Офлайн

#5 Окт. 5, 2015 08:56:01

Chocobo
Зарегистрирован: 2014-10-07
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

py.user.next
Спасибо! буду курить threading
Был бы благодарен за небольшой пример, как связать время выполнения команды одного потока с отображением чего либо в другом?
Тема потоков для меня пока новая)

Офлайн

#6 Окт. 5, 2015 12:14:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

Офлайн

#7 Окт. 5, 2015 15:39:36

Chocobo
Зарегистрирован: 2014-10-07
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

В общем, изрыв пол инета по своему вопросу, и вашим наставлениям - нашел и подогнал под себя следующий пример, который хоть и делает примерно то, что нужно, но мне не очень нравится. По сути и есть второй поток который выводит прогресс и ждет себе сигнала завершения, но как-то не изящно совсем:

import sys
import time
import threading
class progress_bar_loading(threading.Thread):
    def run(self):
            start = time.time()
            global stop
            global kill
            print('Loading....  '),
            sys.stdout.flush()
            i = 0
            while stop != True:
                    sys.stdout.write("\r "+'Loading: '+'\b*'*(i%4)+'\t\t\t\t\t{0}'.ljust(0).format(time.time() - start))
                    sys.stdout.flush()
                    time.sleep(0.5)
                    i+=1
            print '\b\b Done!'
kill = False
stop = False
try:
    #anything you want to run.
    p = progress_bar_loading()
    p.start()
    time.sleep(8)
    stop = True
    time.sleep(1)
    print 
    p2 = progress_bar_loading()
    stop = False
    p2.start()
    time.sleep(5)
    stop = True
except KeyboardInterrupt or EOFError:
         stop = True

Отредактировано Chocobo (Окт. 5, 2015 15:46:15)

Офлайн

#8 Окт. 5, 2015 15:56:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

Chocobo
но как-то не изящно совсем
Используй очередь. Не надо на глобальных переменных делать.

Chocobo
В общем, изрыв пол инета по своему вопросу, и вашим наставлениям - нашел и подогнал под себя
Вот там ссылка выше, там прямой пример того, как обмениваться данными между главным потоком и порождённым из него.



Офлайн

#9 Окт. 6, 2015 02:19:43

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

индикатор процесса выполнения

py.user.next
Да, глобальные переменные используют только если нет других вариантов.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version