diff --git a/booking_service.py b/booking_service.py index eff0cf1..f3c76b1 100755 --- a/booking_service.py +++ b/booking_service.py @@ -6,7 +6,7 @@ import logging import uvloop import click -from punkow.service import interface, model, worker +from punkow.service import interface, model, worker, timer @click.command() @@ -15,7 +15,9 @@ from punkow.service import interface, model, worker @click.option("--db", default="sqlite:////tmp/punkow.db", help="The database uri") @click.option("--interval", default=50 * 5, type=int, help="The interval in which the worker should operate") @click.option("--debug", is_flag=True, help="Run in debug mode") -def main(host, port, db, interval, debug): +@click.option("--tz", default="CET", help="Timezone to use for special times") +@click.option("--special", help="special time where the interval should be increased", multiple=True) +def main(host, port, db, interval, debug, tz, special): asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) loop = asyncio.get_event_loop() @@ -33,7 +35,9 @@ def main(host, port, db, interval, debug): db_mngr = model.DatabaseManager(db) db_mngr.create_schema() - wrk = worker.Worker(loop, db_mngr, interval=interval, debug=debug) + tm = timer.Timer(interval=interval, special_times=special, time_zone=tz) + + wrk = worker.Worker(loop, db_mngr, tm=tm, debug=debug) loop.create_task(wrk.run()) app = interface.App(db_mngr) diff --git a/punkow/service/worker.py b/punkow/service/worker.py index 3860221..4998fc6 100644 --- a/punkow/service/worker.py +++ b/punkow/service/worker.py @@ -8,7 +8,7 @@ import typing from sqlalchemy import func from sqlalchemy.orm import joinedload -from . import model +from . import model, timer from .. import scraper logger = logging.getLogger(__name__) @@ -72,10 +72,10 @@ def _book(target: str, reqs: typing.List[_WorkerRequest], debug=False) -> typing class Worker(object): - def __init__(self, loop: asyncio.AbstractEventLoop, db: model.DatabaseManager, interval=5 * 60, debug=True): + def __init__(self, loop: asyncio.AbstractEventLoop, db: model.DatabaseManager, tm: timer.Timer, debug=True): self._loop = loop self._db = db - self._interval = interval + self._timer = tm self._debug = debug self._executor = concurrent.futures.ProcessPoolExecutor(max_workers=1) @@ -150,10 +150,5 @@ class Worker(object): async def run(self): while True: - start = datetime.datetime.utcnow() - await self._run_once() - end = datetime.datetime.utcnow() - elapsed = (end - start).total_seconds() - sleep = max(0.0, self._interval - elapsed) - logger.debug("Booking run completed in %0.2f seconds - now sleep for %0.2f seconds", elapsed, sleep) - await asyncio.sleep(sleep) + with self._timer.timed(): + await self._run_once()