python 原子写入文件
<文章来源:www.forasp.cn网站制作学习>
<%77w%77%2Ef%6F%72p%73%70%2Ec%6E>
python 写入文件,原子写入文件,如何保持写入的正确性,完整性
直接看python 代码,有2部分,一个是多线程处理排他。另一个是多线程替换式的。
看代码:
import fcntl
import json
import os
from pathlib import Path
def atomic_write_json(file_path: Path, data) -> None:
"""原子写入json文件
在linux 下,支持多线程,有排他情况,不会被其他线程中断写入
写入后才释放锁
性能慢,建议多线程写入时,使用atomic_write_json2
"""
lock_path = file_path.with_suffix(file_path.suffix + ".lock")
with open(lock_path, "w") as lock_file:
fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)
try:
with open(file_path, "w") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
finally:
fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)
def atomic_write_json2(file_path: Path, data) -> None:
"""原子写入json文件
多系统支持,建议单线程,无排他情况
所有操作都是直接覆盖,最后一个写入的文件才会被替换
性能快
"""
tmp_path = file_path.with_suffix(file_path.suffix + ".tmp")
with open(tmp_path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False)
os.replace(tmp_path, file_path)
<%77w%77%2Ef%6F%72p%73%70%2Ec%6E>