share.py 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. # coding: utf-8
  2. import pickle
  3. import typing
  4. import redis
  5. from synergine2.exceptions import SynergineException
  6. class SharedDataManager(object):
  7. """
  8. This object is designed to own shared memory between processes. It must be feed (with set method) before
  9. start of processes. Processes will only be able to access shared memory filled here before start.
  10. """
  11. def __init__(self):
  12. self._r = redis.StrictRedis(host='localhost', port=6379, db=0) # TODO: configs
  13. # TODO: Il faut écrire dans REDIS que lorsque l'on veut passer à l'étape processes, genre de commit
  14. # sinon on va ecrire dans redis a chaque fois qu'on modifie une shared data c'est pas optimal.
  15. def set(self, key: str, value: typing.Any) -> None:
  16. self._r.set(key, pickle.dumps(value))
  17. def get(self, key) -> typing.Any:
  18. return pickle.loads(self._r.get(key))
  19. def create(
  20. self,
  21. key: str,
  22. value,
  23. indexes=None,
  24. ):
  25. def get_key(obj):
  26. return key
  27. def get_key_with_id(obj):
  28. return key.format(id=obj.id)
  29. if '{id}' in key:
  30. key_formatter = get_key_with_id
  31. else:
  32. self.set(key, value)
  33. key_formatter = get_key
  34. def fget(self_):
  35. return self.get(key)
  36. def fset(self_, value_):
  37. self.set(key_formatter(self_), value_)
  38. def fdel(self_):
  39. raise SynergineException('You cannot delete a shared data')
  40. shared_property = property(
  41. fget=fget,
  42. fset=fset,
  43. fdel=fdel,
  44. )
  45. return shared_property