import contextlib, errno, os, time @contextlib.contextmanager def flock(path, wait_delay=.1): while True: try: fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_RDWR) except OSError, e: if e.errno != errno.EEXIST: raise time.sleep(wait_delay) continue else: break try: yield fd finally: os.unlink(path)