heartbeat.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.worker.heartbeat
  4. ~~~~~~~~~~~~~~~~~~~~~~~
  5. This is the internal thread that sends heartbeat events
  6. at regular intervals.
  7. :copyright: (c) 2009 - 2012 by Ask Solem.
  8. :license: BSD, see LICENSE for more details.
  9. """
  10. from __future__ import absolute_import
  11. from .state import SOFTWARE_INFO
  12. class Heart(object):
  13. """Timer sending heartbeats at regular intervals.
  14. :param timer: Timer instance.
  15. :param eventer: Event dispatcher used to send the event.
  16. :keyword interval: Time in seconds between heartbeats.
  17. Default is 30 seconds.
  18. """
  19. def __init__(self, timer, eventer, interval=None):
  20. self.timer = timer
  21. self.eventer = eventer
  22. self.interval = float(interval or 5.0)
  23. self.tref = None
  24. # Make event dispatcher start/stop us when it's
  25. # enabled/disabled.
  26. self.eventer.on_enabled.add(self.start)
  27. self.eventer.on_disabled.add(self.stop)
  28. def _send(self, event):
  29. return self.eventer.send(event, freq=self.interval, **SOFTWARE_INFO)
  30. def start(self):
  31. if self.eventer.enabled:
  32. self._send("worker-online")
  33. self.tref = self.timer.apply_interval(self.interval * 1000.0,
  34. self._send, ("worker-heartbeat", ))
  35. def stop(self):
  36. if self.tref is not None:
  37. self.timer.cancel(self.tref)
  38. self.tref = None
  39. if self.eventer.enabled:
  40. self._send("worker-offline")