share.py 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # coding: utf-8
  2. import pickle
  3. import typing
  4. import redis
  5. from synergine2.exceptions import SynergineException
  6. from synergine2.exceptions import UnknownSharedData
  7. class SharedDataManager(object):
  8. """
  9. This object is designed to own shared memory between processes. It must be feed (with set method) before
  10. start of processes. Processes will only be able to access shared memory filled here before start.
  11. """
  12. def __init__(self, clear: bool=True):
  13. self._r = redis.StrictRedis(host='localhost', port=6379, db=0) # TODO: configs
  14. self._data = {}
  15. self._modified_keys = set()
  16. if clear:
  17. self._r.flushdb()
  18. def set(self, key: str, value: typing.Any) -> None:
  19. self._data[key] = value
  20. self._modified_keys.add(key)
  21. def get(self, key) -> typing.Any:
  22. if key not in self._data:
  23. b_value = self._r.get(key)
  24. if b_value is None:
  25. # We not allow None value storage
  26. raise UnknownSharedData('No shared data for key "{}"'.format(key))
  27. self._data[key] = pickle.loads(b_value)
  28. return self._data[key]
  29. def commit(self) -> None:
  30. for key in self._modified_keys:
  31. self._r.set(key, pickle.dumps(self.get(key)))
  32. self._modified_keys = set()
  33. def refresh(self) -> None:
  34. self._data = {}
  35. def create(
  36. self,
  37. key: str,
  38. value,
  39. indexes=None,
  40. ):
  41. def get_key(obj):
  42. return key
  43. def get_key_with_id(obj):
  44. return key.format(id=obj.id)
  45. if '{id}' in key:
  46. key_formatter = get_key_with_id
  47. else:
  48. self.set(key, value)
  49. key_formatter = get_key
  50. def fget(self_):
  51. return self.get(key)
  52. def fset(self_, value_):
  53. self.set(key_formatter(self_), value_)
  54. def fdel(self_):
  55. raise SynergineException('You cannot delete a shared data')
  56. shared_property = property(
  57. fget=fget,
  58. fset=fset,
  59. fdel=fdel,
  60. )
  61. return shared_property