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