uuid_lock.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import time
  2. import uuid
  3. from google.appengine.api import memcache
  4. from exceptions import TimeoutException
  5. class UUIDLock(object):
  6. def __init__(self, key, default_timeout=24*3600, max_wait_time=60, force_lock=True):
  7. self.uuid = uuid.uuid4()
  8. self.key = key
  9. self.default_timeout = default_timeout
  10. self.force_lock = force_lock
  11. self.max_wait_time = max_wait_time
  12. self.wait_interval = max_wait_time * 10
  13. self.count = 0
  14. def is_open(self):
  15. initial_value = memcache.get(self.key)
  16. return initial_value is None or initial_value is False
  17. def lock(self):
  18. if not self.is_open():
  19. self._wait()
  20. return self._lock()
  21. def _lock(self):
  22. result = memcache.set(self.key, self.uuid)
  23. if self.is_lock_acquired():
  24. return result
  25. else:
  26. self._wait()
  27. return self._lock()
  28. def is_lock_acquired(self):
  29. return memcache.get(self.key) == self.uuid
  30. def _wait(self):
  31. while(not self.is_open() or self.force_lock):
  32. time.sleep(.1)
  33. self.count += 1
  34. if self.count > self.wait_interval:
  35. raise TimeoutException('Timeout')
  36. def release(self):
  37. self._release()
  38. def _release(self):
  39. if self.is_lock_acquired():
  40. memcache.delete(self.key)
  41. return True
  42. else:
  43. return False