27 lines
738 B
Python
27 lines
738 B
Python
import datetime
|
|
from typing import Callable, List, Any
|
|
|
|
|
|
class Scheduler:
|
|
def __init__(self):
|
|
self.jobs = {}
|
|
|
|
def schedule(self, name: str, every: datetime.timedelta, func: Callable[..., None], *args: List[Any]):
|
|
self.jobs[name] = {
|
|
'call': func,
|
|
'args': args,
|
|
'timedelta': every,
|
|
'runat': (datetime.datetime.utcnow() + every)
|
|
}
|
|
|
|
def unschedule(self, name: str):
|
|
if name in self.jobs:
|
|
del self.jobs[name]
|
|
|
|
def run_pending(self):
|
|
now = datetime.datetime.utcnow()
|
|
for _, job in self.jobs:
|
|
if job['runat'] <= now:
|
|
job['runat'] += job['timedelta']
|
|
job['call'](*job['args'])
|