52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import logging
|
|
from threading import Thread, Event
|
|
|
|
from .exceptions import ConnectionError, TimeoutError
|
|
|
|
|
|
class HeartbeatThread(Thread):
|
|
|
|
daemon = True
|
|
|
|
def __init__(
|
|
self, send_heartbeat,
|
|
relax_interval_in_seconds,
|
|
hurry_interval_in_seconds):
|
|
super(HeartbeatThread, self).__init__()
|
|
self._send_heartbeat = send_heartbeat
|
|
self._relax_interval_in_seconds = relax_interval_in_seconds
|
|
self._hurry_interval_in_seconds = hurry_interval_in_seconds
|
|
self._adrenaline = Event()
|
|
self._rest = Event()
|
|
self._halt = Event()
|
|
|
|
def run(self):
|
|
try:
|
|
while not self._halt.is_set():
|
|
try:
|
|
self._send_heartbeat()
|
|
except TimeoutError:
|
|
pass
|
|
if self._adrenaline.is_set():
|
|
interval_in_seconds = self._hurry_interval_in_seconds
|
|
else:
|
|
interval_in_seconds = self._relax_interval_in_seconds
|
|
self._rest.wait(interval_in_seconds)
|
|
except ConnectionError:
|
|
logging.debug('[heartbeat connection error]')
|
|
|
|
def relax(self):
|
|
self._adrenaline.clear()
|
|
|
|
def hurry(self):
|
|
self._adrenaline.set()
|
|
self._rest.set()
|
|
self._rest.clear()
|
|
|
|
@property
|
|
def hurried(self):
|
|
return self._adrenaline.is_set()
|
|
|
|
def halt(self):
|
|
self._rest.set()
|
|
self._halt.set()
|