From 0c38745ffac169a5f6ff7af4dae4fb34940611b0 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 25 Dec 2023 18:07:37 -0500 Subject: [PATCH] fix atomic write --- modules/shared.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/shared.py b/modules/shared.py index f8c1e5fed..cd70bf54d 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -214,7 +214,7 @@ def readfile(filename, silent=False, lock=False): return data -def writefile(data, filename, mode='w', silent=False): +def writefile(data, filename, mode='w', silent=False, atomic=False): lock = None locked = False import tempfile @@ -241,13 +241,15 @@ def writefile(data, filename, mode='w', silent=False): raise ValueError('not a valid object') lock = fasteners.InterProcessReaderWriterLock(f"{filename}.lock", logger=log) locked = lock.acquire_write_lock(blocking=True, timeout=3) - with tempfile.NamedTemporaryFile(mode=mode, encoding="utf8", delete=False, dir=os.path.dirname(filename)) as f: - f.write(output) - f.flush() - os.fsync(f.fileno()) - os.replace(f.name, filename) - # with open(filename, mode=mode, encoding="utf8") as file: - # file.write(output) + if atomic: + with tempfile.NamedTemporaryFile(mode=mode, encoding="utf8", delete=False, dir=os.path.dirname(filename)) as f: + f.write(output) + f.flush() + os.fsync(f.fileno()) + os.replace(f.name, filename) + else: + with open(filename, mode=mode, encoding="utf8") as file: + file.write(output) t1 = time.time() if not silent: log.debug(f'Save: file="{filename}" json={len(data)} bytes={len(output)} time={t1-t0:.3f}')