Mercurial > templog
view web/atomicfile.py @ 500:136b1343e640
merge
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 24 Mar 2014 20:49:00 +0800 |
parents | 46e327c00246 |
children | 6dd157a12035 |
line wrap: on
line source
import os import time import fcntl import sys class AtomicFile(object): DELAY = 0.5 def __init__(self, name): self.name = name def write(self, data, timeout = 5): try: end = time.time() + timeout with open(self.name, "r+") as f: while timeout == 0 or time.time() < end: try: fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: time.sleep(DELAY) continue f.write(data) return True except IOError, e: print>>sys.stderr, e return False def read(self, timeout = 5): try: end = time.time() + timeout with open(self.name, "r") as f: while timeout == 0 or time.time() < end: try: fcntl.lockf(f, fcntl.LOCK_SH | fcntl.LOCK_NB) except IOError: time.sleep(DELAY) continue return f.read() except IOError, e: print>>sys.stderr, e return None