Thông thường có hai cấp độ đệm liên quan:
- Bộ đệm nội bộ
- Bộ đệm hệ điều hành
Bộ đệm nội bộ là bộ đệm được tạo bởi bộ thực thi / thư viện / ngôn ngữ mà bạn đang lập trình và có nghĩa là tăng tốc mọi thứ bằng cách tránh các cuộc gọi hệ thống cho mỗi lần ghi. Thay vào đó, khi bạn ghi vào một đối tượng tệp, bạn ghi vào bộ đệm của nó và bất cứ khi nào bộ đệm đầy, dữ liệu được ghi vào tệp thực tế bằng các lệnh gọi hệ thống.
Tuy nhiên, do bộ đệm của hệ điều hành, điều này có thể không có nghĩa là dữ liệu được ghi vào đĩa . Nó có thể chỉ có nghĩa là dữ liệu được sao chép từ bộ đệm được duy trì bởi thời gian chạy của bạn vào bộ đệm được duy trì bởi hệ điều hành.
Nếu bạn viết một cái gì đó, và nó kết thúc trong bộ đệm (chỉ) và nguồn điện bị cắt vào máy của bạn, dữ liệu đó không nằm trên đĩa khi máy tắt.
Vì vậy, để giúp với điều đó, bạn có flush
vàfsync
phương thức phương thức tương ứng.
Đầu tiên, flush
đơn giản sẽ ghi ra bất kỳ dữ liệu nào lưu lại trong bộ đệm chương trình vào tệp thực tế. Thông thường, điều này có nghĩa là dữ liệu sẽ được sao chép từ bộ đệm chương trình sang bộ đệm hệ điều hành.
Cụ thể điều này có nghĩa là nếu một quá trình khác có cùng tệp được mở để đọc, nó sẽ có thể truy cập dữ liệu bạn vừa xóa vào tệp. Tuy nhiên, điều đó không nhất thiết có nghĩa là nó đã được lưu trữ "vĩnh viễn" trên đĩa.
Để làm điều đó, bạn cần gọi os.fsync
phương thức đảm bảo tất cả các bộ đệm của hệ điều hành được đồng bộ hóa với các thiết bị lưu trữ mà nói cách khác, phương thức đó sẽ sao chép dữ liệu từ bộ đệm của hệ điều hành vào đĩa.
Thông thường, bạn không cần phải bận tâm với một trong hai phương pháp, nhưng nếu bạn đang ở trong một tình huống mà sự hoang tưởng về những gì thực sự kết thúc trên đĩa là một điều tốt, bạn nên thực hiện cả hai cuộc gọi theo hướng dẫn.
Phụ lục năm 2018.
Lưu ý rằng các đĩa có cơ chế bộ đệm hiện phổ biến hơn nhiều so với năm 2013, vì vậy bây giờ thậm chí còn có nhiều cấp độ bộ đệm và bộ đệm hơn. Tôi cho rằng các bộ đệm này cũng sẽ được xử lý bằng các cuộc gọi đồng bộ / xóa, nhưng tôi thực sự không biết.
with file('blah') as fd: #dostuff
cấu trúc, tôi biết nó đảm bảo đóng bộ mô tả tệp. Nó cũng tuôn ra hoặc đồng bộ hóa?