|
- import fcntl
- import shelve
-
- class FileLock(object):
- def __init__(self, fname = None):
- self.f = open(fname, 'w+')
- self.islocked = False
-
- def close(self):
- self.f.close()
- self.islocked = None
-
- def exclusivelock(self):
- fcntl.flock(self.f.fileno(), fcntl.LOCK_EX)
- self.islocked = True
-
- def sharedlock(self):
- fcntl.flock(self.f.fileno(), fcntl.LOCK_SH)
- self.islocked = True
-
- def unlock(self):
- fcntl.flock(self.f.fileno(), fcntl.LOCK_UN)
- self.islocked = False
-
- class LockShelve(FileLock, shelve.DbfilenameShelf):
- def __init__(self, fname, *args, **kwargs):
- FileLock.__init__(self, fname + ".lock")
- self.exclusivelock()
- try:
- shelve.DbfilenameShelf.__init__(self, fname, *args, **kwargs)
- except:
- self.close()
- raise
|