heartbeat.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import threading
  2. from time import time, sleep
  3. class Heart(threading.Thread):
  4. interval = 60
  5. def __init__(self, eventer, interval=None):
  6. super(Heart, self).__init__()
  7. self.eventer = eventer
  8. self.interval = interval or self.interval
  9. self._shutdown = threading.Event()
  10. self._stopped = threading.Event()
  11. self.setDaemon(True)
  12. self._state = None
  13. def run(self):
  14. self._state = "RUN"
  15. interval = self.interval
  16. dispatch = self.eventer.send
  17. dispatch("worker-online")
  18. # We can't sleep all of the interval, because then
  19. # it takes 60 seconds (or value of interval) to shutdown
  20. # the thread.
  21. last_beat = None
  22. while 1:
  23. if self._shutdown.isSet():
  24. break
  25. now = time()
  26. if not last_beat or now > last_beat + interval:
  27. last_beat = now
  28. dispatch("worker-heartbeat")
  29. sleep(1)
  30. try:
  31. dispatch("worker-offline")
  32. finally:
  33. self._stopped.set()
  34. def stop(self):
  35. """Gracefully shutdown the thread."""
  36. if not self._state == "RUN":
  37. return
  38. self._state = "CLOSE"
  39. self._shutdown.set()
  40. self._stopped.wait() # block until this thread is done