2013-03-25 11 views
7

C'è un argomento facoltativo booleano alla funzione print()flush che per impostazione predefinita è False.Che cosa fa "flush" di print()?

La documentazione dice che è per scaricare il flusso forzatamente.

Non capisco il concetto di lavaggio. Cosa sta scaricando qui? Cos'è il flushing del flusso?

+2

Credo che questo imponga tutti i dati da stampare alla console per essere immediatamente "svuotati" sulla console effettiva e lasciare il buffer di stampa in sospeso –

+0

@ChristianStewart Non riesco a ottenere il concetto. Puoi indicarmi un esempio pratico? –

+0

@ChristianStewart: Non sono sicuro che sia sempre il caso, ricordo casi in cui era necessario avere una nuova riga per "autoflush". Questo probabilmente dipende dal sistema operativo sottostante. – Anthon

risposta

7

Generalmente l'output su un file o sulla console viene memorizzato nel buffer, con l'output del testo almeno fino alla stampa di una nuova riga. Il flush fa in modo che qualsiasi output che viene memorizzato nel buffer vada alla destinazione.

Lo uso, ad es. quando faccio un prompt utente come Do you want to continue (Y/n):, prima di ottenere l'input.

questo può essere simulato (su Ubuntu 12.4 usando 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) 

Se si esegue questo, si vedrà che la stringa di prompt non viene visualizzato fino a quando le estremità del sonno e il programma termina. Se annulli la riga con flush, visualizzerai il prompt e dovrai attendere 5 secondi per il completamento del programma

+0

Quello che pensavo fosse –

+0

Ho davvero bisogno di un esempio di come si differenzia dall'impostazione predefinita. –

+0

Spero che questo ti aiuti @ La spiegazione di Yuushi ha più dettagli dei miei, prova a vedere se questo ti aiuta pure. – Anthon

9

Qui ci sono un paio di cose da capire. Uno è la differenza tra I/O bufferizzato e I/O senza buffer. Il concetto è abbastanza semplice - per l'I/O bufferizzato, c'è un buffer interno che viene mantenuto. Solo quando il buffer è pieno (o qualche altro evento, ad esempio quando raggiunge una nuova riga), l'output viene "svuotato". Con l'I/O senza buffer, ogni volta che viene effettuata una chiamata per generare qualcosa, lo farà, 1 carattere alla volta.

maggior parte delle funzioni di I/O rientrano nella categoria tamponata, principalmente per motivi di prestazioni: è molto più veloce di scrivere pezzi alla volta (tutte le funzioni di I/O alla fine scendere a chiamate di sistema di qualche descrizione, che sono costosi.)

flush consente di scegliere manualmente quando si desidera che questo buffer interno venga scritto: una chiamata per il flush scriverà qualsiasi carattere nel buffer. Generalmente, questo non è necessario, perché lo stream gestirà questo stesso. Tuttavia, ci possono essere situazioni in cui vuoi essere sicuro che qualcosa venga emesso prima di continuare: è qui che utilizzi una chiamata allo flush().