share.py 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # coding: utf-8
  2. import typing
  3. import pylibmc
  4. from synergine2.exceptions import SynergineException
  5. class SharedDataManager(object):
  6. """
  7. This object is designed to own shared memory between processes. It must be feed (with set method) before
  8. start of processes. Processes will only be able to access shared memory filled here before start.
  9. """
  10. def __init__(self):
  11. self._mc = pylibmc.Client(['127.0.0.1'], binary=True, behaviors={"tcp_nodelay": True, "ketama": True})
  12. def set(self, key: str, value: typing.Any) -> None:
  13. self._mc.set(key, value)
  14. def get(self, key) -> typing.Any:
  15. return self._mc.get(key)
  16. def create(
  17. self,
  18. key: str,
  19. value,
  20. indexes=None,
  21. ):
  22. def get_key(obj):
  23. return key
  24. def get_key_with_id(obj):
  25. return key.format(id=obj.id)
  26. if '{id}' in key:
  27. key_formatter = get_key_with_id
  28. else:
  29. self.set(key, value)
  30. key_formatter = get_key
  31. def fget(self_):
  32. return self.get(key)
  33. def fset(self_, value_):
  34. self.set(key_formatter(self_), value_)
  35. def fdel(self_):
  36. raise SynergineException('You cannot delete a shared data')
  37. shared_property = property(
  38. fget=fget,
  39. fset=fset,
  40. fdel=fdel,
  41. )
  42. return shared_property