Tăng kích thước bộ đệm stdout của Python
Có cách nào để tăng stdoutkích thước bộ đệm từ 8182 trong Python hoặc để trì hoãn quá trình xả cho đến khi tôi thực sự gọi flushkhông?
Những điều tôi đã thử nhưng không hoạt động:
- Tôi có thể giải quyết vấn đề này trên Windows vì tôi có thể truy cập bộ đệm trực tiếp (ví dụ: xem câu trả lời của tôi cho bài đăng này ). Nhưng điều này không hiệu quả với Unix.
- Tôi có thể tăng kích thước bộ đệm cho tệp bằng cách chuyển
buffertới hàm tạo, tuy nhiên, tệpstdoutđã được xây dựng. - Tắt bộ đệm (
python -u) rõ ràng là làm cho mọi thứ tồi tệ hơn! - Việc sử dụng bộ đệm tạm thời gặp phải các vấn đề tương tự -
stdoutđược xóa sau mỗi byte thứ 8192 được sao chép từ bộ đệm tạm thời.
Cơ sở lý luận: Mục đích ở đây là giảm hiện tượng nhấp nháy trên bảng điều khiển. Việc đệm mọi thứ, theo như câu hỏi này thực sự hoạt động, chẳng hạn như khi tôi thử bằng C hoặc bằng cách sử dụng Windows API bằng Python, nhưng giới hạn 8182 trong Python dường như đang gây ra sự cố mà tôi không thể giải quyết trên Unix.
Trả lời
Bạn có thể bọc luồng stdout thô, có sẵn dưới dạng sys.stdout.buffer, với kích thước bộ đệm lớn hơn với io.BufferedWritervà sau đó bọc luồng nhị phân được đệm kết quả dưới dạng luồng văn bản được đệm bằng io.TextIOWrapper:
import io
import sys
sys.stdout = io.TextIOWrapper(io.BufferedWriter(sys.stdout.buffer, new_size))
Dưới đây là minh họa về tác dụng của việc tăng kích thước bộ đệm của stdout lên 100000 để nó không xả hai đầu ra in dài 10000 ký tự cho đến khi quá trình xả thủ công được gọi:
import io
import sys
import time
print('Original buffer size:', io.DEFAULT_BUFFER_SIZE)
for large_buffer in False, True:
if large_buffer:
print('Increasing buffer size...')
sys.stdout = io.TextIOWrapper(io.BufferedWriter(sys.stdout.buffer, 100000))
for i in range(2):
time.sleep(2)
print(str(i * 2) * 10000)
time.sleep(2)
print(str(i * 2 + 1) *10000)
print(f'Flush #{i + 1}')
sys.stdout.flush()
Bản giới thiệu: https://repl.it/@blhsing/UnkemptGullibleDecompiler
Tìm thấy câu trả lời, thực sự rất đơn giản:
my_stdout = open( 1, "w", buffering = 100000 )
1làfilenochostdout.sys.stdout = my_stdoutcó thể được sử dụng để thực hiện thay đổi đối vớiprintmục tiêu mặc định .- Tôi chỉ thử nghiệm điều này trên Unix.