Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions timeloop/app.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import logging
import sys
import signal
Expand All @@ -20,8 +21,8 @@ def __init__(self):
logger.setLevel(logging.INFO)
self.logger = logger

def _add_job(self, func, interval, *args, **kwargs):
j = Job(interval, func, *args, **kwargs)
def _add_job(self, func, interval, run_on_start, *args, **kwargs):
j = Job(interval, run_on_start, func, *args, **kwargs)
self.jobs.append(j)

def _block_main_thread(self):
Expand All @@ -46,9 +47,12 @@ def _stop_jobs(self):
self.logger.info("Stopping job {}".format(j.execute))
j.stop()

def job(self, interval):
def job(self, interval=None, run_on_start=False):
if not interval or not isinstance(interval, datetime.timedelta):
raise TypeError('interval must be a timedelta and cannot be None')

def decorator(f):
self._add_job(f, interval)
self._add_job(f, interval, run_on_start)
return f
return decorator

Expand Down
13 changes: 11 additions & 2 deletions timeloop/job.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
import logging

from threading import Thread, Event
from datetime import timedelta


class Job(Thread):
def __init__(self, interval, execute, *args, **kwargs):
def __init__(self, interval, run_on_start, execute, *args, **kwargs):
Thread.__init__(self)
self.stopped = Event()
self.interval = interval
self.run_on_start = run_on_start
self.execute = execute
self.args = args
self.kwargs = kwargs
self.logger = logging.getLogger('timeloop')

def stop(self):
self.stopped.set()
self.join()

def run(self):
if self.run_on_start:
self.logger.info("Executing on start: {}".format(self.execute))
self.execute(*self.args, **self.kwargs)

while not self.stopped.wait(self.interval.total_seconds()):
self.logger.info("Executing on interval: {}".format(self.execute))
self.execute(*self.args, **self.kwargs)