Integrate the timer in the service

This commit is contained in:
Jan Losinski 2019-01-17 23:25:39 +01:00
parent f3763a3d29
commit 1506e2bc63
2 changed files with 12 additions and 13 deletions

View File

@ -6,7 +6,7 @@ import logging
import uvloop import uvloop
import click import click
from punkow.service import interface, model, worker from punkow.service import interface, model, worker, timer
@click.command() @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("--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("--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") @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()) asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
@ -33,7 +35,9 @@ def main(host, port, db, interval, debug):
db_mngr = model.DatabaseManager(db) db_mngr = model.DatabaseManager(db)
db_mngr.create_schema() 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()) loop.create_task(wrk.run())
app = interface.App(db_mngr) app = interface.App(db_mngr)

View File

@ -8,7 +8,7 @@ import typing
from sqlalchemy import func from sqlalchemy import func
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from . import model from . import model, timer
from .. import scraper from .. import scraper
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -72,10 +72,10 @@ def _book(target: str, reqs: typing.List[_WorkerRequest], debug=False) -> typing
class Worker(object): 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._loop = loop
self._db = db self._db = db
self._interval = interval self._timer = tm
self._debug = debug self._debug = debug
self._executor = concurrent.futures.ProcessPoolExecutor(max_workers=1) self._executor = concurrent.futures.ProcessPoolExecutor(max_workers=1)
@ -150,10 +150,5 @@ class Worker(object):
async def run(self): async def run(self):
while True: while True:
start = datetime.datetime.utcnow() with self._timer.timed():
await self._run_once() 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)