Skip to content

Commit

Permalink
Teach workers to postpone jobs until after a particular time
Browse files Browse the repository at this point in the history
  • Loading branch information
BjarniRunar committed Oct 23, 2014
1 parent 2e1e3e2 commit 8fd98fe
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions mailpile/workers.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ def __init__(self, name, session, daemon=False):
self.name = name or 'Worker'
self.ALIVE = False
self.JOBS = []
self.JOBS_LATER = []
self.LOCK = threading.Condition(WorkerRLock())
self.last_run = time.time()
self.running = 'Idle'
Expand All @@ -167,22 +168,32 @@ def __init__(self, name, session, daemon=False):
self.important = False

def __str__(self):
return ('%s: %s (%ds, jobs=%s)'
return ('%s: %s (%ds, jobs=%s, jobs_after=%s)'
% (threading.Thread.__str__(self),
self.running,
time.time() - self.last_run,
len(self.JOBS)))
len(self.JOBS), len(self.JOBS_LATER)))

def add_task(self, session, name, task, unique=False, first=False):
def add_task(self, session, name, task,
after=None, unique=False, first=False):
with self.LOCK:
if unique:
for s, n, t in self.JOBS:
if n == name:
return
if unique and after:
for ts, (s, n, t) in self.JOBS_LATER:
if n == name:
return

snt = (session, name, task)
if first:
self.JOBS.append((session, name, task))
self.JOBS.append(snt)
elif after:
self.JOBS_LATER.append((after, snt))
else:
self.JOBS[:0] = [(session, name, task)]
self.JOBS[:0] = [snt]

self.LOCK.notify()

def add_unique_task(self, session, name, task, **kwargs):
Expand Down Expand Up @@ -229,6 +240,12 @@ def run(self):
self._play_nice_with_threads()
with self.LOCK:
session, name, task = self.JOBS.pop(0)
if len(self.JOBS) < 0:
now = time.time()
self.JOBS.extend(snt for ts, snt
in self.JOBS_LATER if ts <= now)
self.JOBS_LATER = [(ts, snt) for ts, snt
in self.JOBS_LATER if ts > now]
try:
self.last_run = time.time()
self.running = name
Expand Down

0 comments on commit 8fd98fe

Please sign in to comment.