heartbeat.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from __future__ import absolute_import
  2. import copy
  3. import time
  4. class Heartbeat(object):
  5. DEFAULT_CONFIG = {
  6. 'heartbeat_interval_ms': 3000,
  7. 'session_timeout_ms': 30000,
  8. }
  9. def __init__(self, **configs):
  10. self.config = copy.copy(self.DEFAULT_CONFIG)
  11. for key in self.config:
  12. if key in configs:
  13. self.config[key] = configs[key]
  14. assert (self.config['heartbeat_interval_ms']
  15. <= self.config['session_timeout_ms']), (
  16. 'Heartbeat interval must be lower than the session timeout')
  17. self.interval = self.config['heartbeat_interval_ms'] / 1000.0
  18. self.timeout = self.config['session_timeout_ms'] / 1000.0
  19. self.last_send = -1 * float('inf')
  20. self.last_receive = -1 * float('inf')
  21. self.last_reset = time.time()
  22. def sent_heartbeat(self):
  23. self.last_send = time.time()
  24. def received_heartbeat(self):
  25. self.last_receive = time.time()
  26. def ttl(self):
  27. last_beat = max(self.last_send, self.last_reset)
  28. return max(0, last_beat + self.interval - time.time())
  29. def should_heartbeat(self):
  30. return self.ttl() == 0
  31. def session_expired(self):
  32. last_recv = max(self.last_receive, self.last_reset)
  33. return (time.time() - last_recv) > self.timeout
  34. def reset_session_timeout(self):
  35. self.last_reset = time.time()