2016-10-04 5 views
0

Я новичок в потоках и многопроцессорности. У меня есть некоторый код, в котором я начинаю процесс, и я хотел выход, чтобы показать активное состояние ожидания чего-то вроде этогоНити и строки Python

wating.... 

Код похож на это ниже:

импорт резьб времени

импорта
class ThreadExample(object): 

    def __init__(self): 
     self.pause = True 
     threading.Thread(target=self.second_thread).start() 
     # Some other processes 
     print("Waiting", end="") 
     while self.pause: 
      time.sleep(1) 
      print(".", end="") 
     print("Hooray!") 

    def second_thread(self): 
     print("timer started") 
     time.sleep(3) 
     self.pause = False 
     print("timer finished") 

if __name__ == "__main__": 
    ThreadExample() 

Когда я запускаю код выше, я получаю выход:

timer started 
Do something else..timer finished 
. 
Hooray! 

не большой сюрприз, за ​​исключением того, что в начале появляется только «таймер», а остальная часть текста появляется в конце в конце.

Если изменить линию печати (" " конец =" ") для печати ("."), Получаем следующий вывод:

timer started 
Do something else. 
. 
timer finished 
. 
Hooray 

, где появляются точки шагом в 1 секунду, который был моим намерением.

Есть ли способ получить «Ожидание ...» на одной линии без конца = «»?

И, во-вторых, я предполагаю, что это связано с внутренними функциями функции print(), а если нет, следует ли выполнять потоки другим способом? Я не думаю, что проблема в GIL, поскольку я пробовал многопроцесс.Процесс и получил тот же результат.

ответ

1

Возможно, это связано с буферизацией print. Он покраснел на \n и в некоторых других случаях (например, переполнение буфера или выход программы). Вместо print попробуйте следующее:

import sys 

def unbuffered_print(msg): 
    sys.stdout.write(msg) 
    sys.stdout.flush() 

... 
unbuffered_print('.') 

всюду.

+0

Примечание: на современном Python (3.3 и выше) ['print' может быть передан' flush = True', чтобы сделать его завершенным после печати] (https://docs.python.org/3/library/functions. html # print), сохраняя при этом полную мощность/гибкость функции 'print'. Поэтому 'print (end = '.', Flush = True)' или 'print ('.', End = '', flush = True)' также будет делать трюк. – ShadowRanger

+0

Спасибо, это очень полезно. – VectorVictor

Смежные вопросы