From 09bd022f5a713c24ab376f0d0901aba436dc151a Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Wed, 27 Oct 2021 09:31:04 +0800 Subject: Separate Lockfile into new class --- jimbrella/lockfile.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 jimbrella/lockfile.py (limited to 'jimbrella/lockfile.py') diff --git a/jimbrella/lockfile.py b/jimbrella/lockfile.py new file mode 100644 index 0000000..b898142 --- /dev/null +++ b/jimbrella/lockfile.py @@ -0,0 +1,33 @@ +import os + + +class Lockfile: + """Prevent unwanted concurrency for file I/O. + + For a file named "", create or remove a lockfile named ".lock". + + When a process is modifying the file, call `lock(). When the modification + is done, call `unlock()`. + """ + + def __init__(self, filepath): + self.filepath = filepath + self.lockpath = filepath + ".lock" + + def lock(self): + """Continue attempting to lock until locked.""" + locked = False + while not locked: + try: + f = open(self.lockpath, "x") + f.close() + locked = True + except FileExistsError: + continue + + def unlock(self): + """Remove lockfile.""" + try: + os.remove(self.lockpath) + except FileNotFoundError: + return -- cgit v1.2.3