Câu trả lời:
Tiêu chuẩn của Python được đệm (có nghĩa là nó thu thập một số dữ liệu "được ghi" thành tiêu chuẩn trước khi ghi vào thiết bị đầu cuối). Việc gọi sys.stdout.flush()
buộc nó phải "xả" bộ đệm, nghĩa là nó sẽ ghi mọi thứ trong bộ đệm vào thiết bị đầu cuối, ngay cả khi bình thường nó sẽ đợi trước khi thực hiện.
Dưới đây là một số thông tin tốt về (un) bộ đệm I / O và lý do tại sao nó hữu ích:
http://en.wikipedia.org/wiki/Data_buffer Được đệm so với IO không có bộ đệm
sys.stdout.write("%d" % i)
, thì tôi phải bỏ cuộc gọi sys.stdout.flush()
để lấy bộ đệm hiển thị khi tập lệnh đang thực thi.
Hãy xem xét tập lệnh Python đơn giản sau:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
Điều này được thiết kế để in một số mỗi giây trong năm giây, nhưng nếu bạn chạy nó như bây giờ (tùy thuộc vào bộ đệm hệ thống mặc định của bạn), bạn có thể không thấy bất kỳ đầu ra nào cho đến khi tập lệnh hoàn thành, và sau đó tất cả bạn sẽ thấy 0 1 2 3 4
được in đến màn hình.
Điều này là do đầu ra đang được đệm và trừ khi bạn xả sys.stdout
sau mỗi lần print
bạn sẽ không thấy đầu ra ngay lập tức. Xóa bình luận từ sys.stdout.flush()
dòng để thấy sự khác biệt.
Theo hiểu biết của tôi, bao giờ chúng ta thực hiện đầu ra câu lệnh in sẽ được ghi vào bộ đệm. Và chúng ta sẽ thấy đầu ra trên màn hình khi bộ đệm bị xóa (xóa). Theo mặc định, bộ đệm sẽ bị xóa khi chương trình thoát. NHƯNG CHÚNG TÔI C CANNG CÓ THỂ CẨN THẬN BUFFER MANUALLY bằng cách sử dụng câu lệnh "sys.stdout.flush ()" trong chương trình. Trong bộ đệm mã dưới đây sẽ bị xóa khi giá trị của i đạt 5.
Bạn có thể hiểu bằng cách thực thi mã dưới đây.
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
nhận được kết quả đầu ra của bạn
Theo sự hiểu biết của tôi, sys.stdout.flush () đẩy tất cả dữ liệu đã được đệm vào điểm đó đến một đối tượng tệp. Trong khi sử dụng thiết bị xuất chuẩn, dữ liệu được lưu trữ trong bộ nhớ đệm (trong một thời gian hoặc cho đến khi bộ nhớ được lấp đầy) trước khi ghi vào thiết bị đầu cuối. Sử dụng lực lượng flush () để làm trống bộ đệm và ghi vào thiết bị đầu cuối ngay cả trước khi bộ đệm có không gian trống.