mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2026-08-13 16:07:30 +00:00
Refactor of caching & data storage part 1
This commit is contained in:
@@ -1,73 +0,0 @@
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from threading import Event, Thread
|
||||
|
||||
import pytz
|
||||
|
||||
|
||||
class CleanupTimer:
|
||||
"""Provides a timed cleanup of the spot list."""
|
||||
|
||||
def __init__(self, spots, alerts, web_server, cleanup_interval):
|
||||
"""Constructor"""
|
||||
|
||||
self._spots = spots
|
||||
self._alerts = alerts
|
||||
self._web_server = web_server
|
||||
self._cleanup_interval = cleanup_interval
|
||||
self.last_cleanup_time = datetime.min.replace(tzinfo=pytz.UTC)
|
||||
self.status = "Starting"
|
||||
self._thread = None
|
||||
self._stop_event = Event()
|
||||
|
||||
def start(self):
|
||||
"""Start the cleanup timer"""
|
||||
|
||||
self._thread = Thread(target=self._run, daemon=True)
|
||||
self._thread.start()
|
||||
|
||||
def stop(self):
|
||||
"""Stop any threads and prepare for application shutdown"""
|
||||
|
||||
self._stop_event.set()
|
||||
|
||||
def _run(self):
|
||||
while not self._stop_event.wait(timeout=self._cleanup_interval):
|
||||
self._cleanup()
|
||||
|
||||
def _cleanup(self):
|
||||
"""Perform cleanup and reschedule next timer"""
|
||||
|
||||
try:
|
||||
# Perform cleanup via letting the data expire
|
||||
self._spots.expire()
|
||||
self._alerts.expire()
|
||||
|
||||
# Explicitly clean up any spots and alerts that have expired
|
||||
for i in list(self._spots.iterkeys()):
|
||||
try:
|
||||
spot = self._spots[i]
|
||||
if spot.expired():
|
||||
self._spots.delete(i)
|
||||
except KeyError:
|
||||
# Must have already been deleted, OK with that
|
||||
pass
|
||||
for i in list(self._alerts.iterkeys()):
|
||||
try:
|
||||
alert = self._alerts[i]
|
||||
if alert.expired():
|
||||
self._alerts.delete(i)
|
||||
except KeyError:
|
||||
# Must have already been deleted, OK with that
|
||||
pass
|
||||
|
||||
# Clean up web server SSE spot/alert queues
|
||||
self._web_server.clean_up_sse_queues()
|
||||
|
||||
self.status = "OK"
|
||||
self.last_cleanup_time = datetime.now(pytz.UTC)
|
||||
|
||||
except Exception:
|
||||
self.status = "Error"
|
||||
logging.exception("Exception in Cleanup thread")
|
||||
self._stop_event.wait(timeout=1)
|
||||
Reference in New Issue
Block a user