Відповіді:
Стандарт стандарту Python буферизований (це означає, що він збирає частину даних, "записаних" для стандартних, перш ніж записати їх в термінал). Виклик sys.stdout.flush()
змушує його "очистити" буфер, це означає, що він запише все в буфер до терміналу, навіть якщо зазвичай він зачекає, перш ніж це зробити.
Ось хороша інформація про (не) буферизований введення-виведення та чому це корисно:
http://en.wikipedia.org/wiki/Data_buffer
Буферизований проти неблокованого IO
sys.stdout.write("%d" % i)
, тоді мені доведеться відмежувати виклик, sys.stdout.flush()
щоб отримати буфер для відображення під час виконання сценарію.
Розглянемо наступний простий скрипт Python:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
Це розроблено для друку одного номера кожну секунду протягом п’яти секунд, але якщо ви запускаєте його таким, як зараз (залежно від буферизації системи за замовчуванням), ви, можливо, не побачите жодного виходу, поки не завершиться сценарій, і тоді все відразу ви побачите 0 1 2 3 4
надруковані на екран.
Це пояснюється тим, що вихід завантажується, і якщо ви не будете промивати їх sys.stdout
після кожного, print
ви не побачите вихід відразу. Видаліть коментар із sys.stdout.flush()
рядка, щоб побачити різницю.
Як я розумію, коли-небудь ми виконуємо оператори друку, вихід буде записаний у буфер. І ми побачимо вихід на екрані, коли буфер розмиється (очиститься). За замовчуванням буфер буде вимитий, коли програма закінчується. АЛЕ МИ МОЖНЕ ТАКОЖ ЗАПИТАТИ БУФЕР РУКОВО, використовуючи в програмі оператор "sys.stdout.flush ()". У наведеному нижче коді буфер буде розмиватися, коли значення i досягне 5.
Це можна зрозуміти, виконавши наведений нижче код.
chiru@online:~$ cat flush.py
import time
import sys
for i in range(10):
print i
if i == 5:
print "Flushing buffer"
sys.stdout.flush()
time.sleep(1)
for i in range(10):
print i,
if i == 5:
print "Flushing buffer"
sys.stdout.flush()
chiru@online:~$ python flush.py
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9
print i
щоб отримати результат
Згідно з моїм розумінням, sys.stdout.flush () виштовхує всі дані, які були завантажені до цього пункту, до файлового об’єкта. Під час використання stdout дані зберігаються в буферній пам'яті (деякий час або до заповнення пам'яті), перш ніж вони записуються в термінал. Використання flush () змушує спорожнити буфер і записати в термінал ще до того, як у буфера буде порожній простір.