server_stubs.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from abc import ABC, abstractmethod
  2. from contextlib import contextmanager
  3. _current_server = None
  4. @contextmanager
  5. def current_server(r):
  6. global _current_server
  7. remote = _current_server
  8. _current_server = r
  9. try:
  10. yield
  11. finally:
  12. _current_server = remote
  13. class ClientReferenceSentinel(ABC):
  14. def __init__(self, client_id, id):
  15. self.client_id = client_id
  16. self.id = id
  17. def __reduce__(self):
  18. remote_obj = self.get_remote_obj()
  19. if remote_obj is None:
  20. return (self.__class__, (self.client_id, self.id))
  21. return (identity, (remote_obj,))
  22. @abstractmethod
  23. def get_remote_obj(self):
  24. pass
  25. def get_real_ref_from_server(self):
  26. global _current_server
  27. if _current_server is None:
  28. return None
  29. client_map = _current_server.client_side_ref_map.get(self.client_id, None)
  30. if client_map is None:
  31. return None
  32. return client_map.get(self.id, None)
  33. class ClientReferenceActor(ClientReferenceSentinel):
  34. def get_remote_obj(self):
  35. global _current_server
  36. real_ref_id = self.get_real_ref_from_server()
  37. if real_ref_id is None:
  38. return None
  39. return _current_server.lookup_or_register_actor(
  40. real_ref_id, self.client_id, None
  41. )
  42. class ClientReferenceFunction(ClientReferenceSentinel):
  43. def get_remote_obj(self):
  44. global _current_server
  45. real_ref_id = self.get_real_ref_from_server()
  46. if real_ref_id is None:
  47. return None
  48. return _current_server.lookup_or_register_func(
  49. real_ref_id, self.client_id, None
  50. )
  51. def identity(x):
  52. return x