simple scheduler to be called from daemon processes or similar

This commit is contained in:
Stefan Harmuth 2021-12-05 10:14:00 +01:00
parent f8db937643
commit 955f4ad88c

View File

@ -4,19 +4,23 @@ from typing import Callable, List, Any
class Scheduler: class Scheduler:
def __init__(self): def __init__(self):
self.jobs = [] self.jobs = {}
def schedule(self, timedelta: datetime.timedelta, func: Callable, *args: List[Any]): def schedule(self, name: str, every: datetime.timedelta, func: Callable[..., None], *args: List[Any]):
self.jobs.append({ self.jobs[name] = {
'func': func, 'call': func,
'args': args, 'args': args,
'timedelta': timedelta, 'timedelta': every,
'runat': (datetime.datetime.utcnow() + timedelta) 'runat': (datetime.datetime.utcnow() + every)
}) }
def unschedule(self, name: str):
if name in self.jobs:
del self.jobs[name]
def run_pending(self): def run_pending(self):
now = datetime.datetime.utcnow() now = datetime.datetime.utcnow()
for job in self.jobs: for _, job in self.jobs:
if job['runat'] <= now: if job['runat'] <= now:
job['runat'] += job['timedelta'] job['runat'] += job['timedelta']
job['func'](*job['args']) job['call'](*job['args'])