2013-03-25 2 views
7

Существует необязательный аргумент boolean для функции print()flush, по умолчанию False.Что делает print() `flush`?

В документации говорится, что он предназначен для принудительного смыва потока.

Я не понимаю концепции промывки. Что здесь смывается? Что такое промывка ручья?

+2

Я считаю, что это вынуждает все данные, которые будут напечатаны на консоли, немедленно «промыть» на фактическую консоль и оставить ожидающий буфер печати. ​​ –

+0

@ChristianStewart. Я не могу получить концепцию. Можете ли вы указать мне практический пример? –

+0

@ChristianStewart: Я не уверен, что это всегда так, я помню случаи, когда вам нужна была новая строка для «autoflush». Вероятно, это зависит от ОС. – Anthon

ответ

7

Обычно вывод в файл или консоль буферизуется с текстом, по крайней мере, до тех пор, пока вы не напечатаете новую строку. Флеш гарантирует, что любой вывод, который буферизуется, отправляется в пункт назначения.

Я использую его, например. когда я делаю запрос пользователя, например Do you want to continue (Y/n):, перед получением ввода.

Это может быть смоделирован (на Ubuntu 12.4 с использованием Python 2.7):

from __future__ import print_function 

import sys 
from time import sleep 

fp = sys.stdout 
print('Do you want to continue (Y/n): ', end='') 
# fp.flush() 
sleep(5) 

Если запустить это, вы увидите, что строка приглашения не показывает вплоть до конца сна и выхода из программы. Если вы раскомментируете строку с флешем, вы увидите приглашение, а затем подождите 5 секунд, чтобы программа закончила

+0

Что я думал –

+0

Мне действительно нужен пример того, как он отличается от стандартного. –

+0

Надеюсь, это поможет вам. Объяснение @ Yuushi имеет более подробную информацию, чем моя, попробуйте выяснить, помогает ли это вам. – Anthon

9

Здесь есть несколько вещей, чтобы понять. Одна из них - разница между буферизованным вводом-выводом и небуферизованным вводом-выводом. Концепция довольно проста - для буферизованного ввода-вывода сохраняется внутренний буфер. Только когда этот буфер заполнен (или происходит какое-либо другое событие, например, оно достигает новой строки), выводится «сброшенный». При небуферизованном вводе-выводе всякий раз, когда делается вызов для вывода чего-либо, он будет делать это, по одному символу за раз.

Большинство функций ввода/вывода попадают в категорию буферизации, главным образом по соображениям производительности: намного быстрее записывать куски за один раз (все функции ввода/вывода в конечном итоге переходят к системным вызовам некоторого описания, которые являются дорогостоящими).

flush позволяет вручную выбрать, когда вы хотите, чтобы этот внутренний буфер был записан - вызов для сброса будет записывать любые символы в буфере. Как правило, это не требуется, потому что поток будет обрабатывать это сам. Тем не менее, могут возникнуть ситуации, когда вы хотите убедиться, что что-то выводится перед продолжением - здесь вы должны использовать вызов flush().

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