diff options
author | Frederick Yin <fkfd@fkfd.me> | 2022-02-02 11:15:09 +0800 |
---|---|---|
committer | Frederick Yin <fkfd@fkfd.me> | 2022-02-02 11:15:09 +0800 |
commit | 66264fe5730943576b847077dadf5e4531d4beb1 (patch) | |
tree | db4b4d1dddd5cd6604e96715bf5c5e0d14fa35ac /jimbrella/lockfile.py | |
parent | 02547e6078a7cd6c1371379f1bab72bf48add23d (diff) |
Adapt core to new db
Diffstat (limited to 'jimbrella/lockfile.py')
-rw-r--r-- | jimbrella/lockfile.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/jimbrella/lockfile.py b/jimbrella/lockfile.py new file mode 100644 index 0000000..987f0e3 --- /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 "<file>", create or remove a lockfile named "<file>.lock". + + When a process is modifying the file, call `lock(). When the modification + is done, call `unlock()`. + """ + + def __init__(self, filepath): + self.filepath = str(filepath) + self.lockpath = self.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 |