123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import time
- import uuid
- from google.appengine.api import memcache
- from exceptions import TimeoutException
- class UUIDLock(object):
- def __init__(self, key, default_timeout=24*3600, max_wait_time=60, force_lock=True):
- self.uuid = uuid.uuid4()
- self.key = key
- self.default_timeout = default_timeout
- self.force_lock = force_lock
- self.max_wait_time = max_wait_time
- self.wait_interval = max_wait_time * 10
- self.count = 0
- def is_open(self):
- initial_value = memcache.get(self.key)
- return initial_value is None or initial_value is False
- def lock(self):
- if not self.is_open():
- self._wait()
- return self._lock()
- def _lock(self):
- result = memcache.set(self.key, self.uuid)
- if self.is_lock_acquired():
- return result
- else:
- self._wait()
- return self._lock()
- def is_lock_acquired(self):
- return memcache.get(self.key) == self.uuid
- def _wait(self):
- while(not self.is_open() or self.force_lock):
- time.sleep(.1)
- self.count += 1
- if self.count > self.wait_interval:
- raise TimeoutException('Timeout')
- def release(self):
- self._release()
- def _release(self):
- if self.is_lock_acquired():
- memcache.delete(self.key)
- return True
- else:
- return False
|