|  | """ | 
|  | Interprocess mutex based on file locks | 
|  | """ | 
|  |  | 
|  | import fcntl | 
|  | import os | 
|  |  | 
|  |  | 
|  | class Lock: | 
|  |  | 
|  | def __init__(self, filename): | 
|  | self.filename = filename | 
|  | # This will create it if it does not exist already | 
|  | unbuffered = 0 | 
|  | self.handle = open(filename, 'a+', unbuffered) | 
|  |  | 
|  | def acquire(self): | 
|  | fcntl.flock(self.handle, fcntl.LOCK_EX) | 
|  |  | 
|  | # will throw IOError if unavailable | 
|  | def try_acquire(self): | 
|  | fcntl.flock(self.handle, fcntl.LOCK_NB | fcntl.LOCK_EX) | 
|  |  | 
|  | def release(self): | 
|  | fcntl.flock(self.handle, fcntl.LOCK_UN) | 
|  |  | 
|  | def __del__(self): | 
|  | self.handle.close() |