diff options
author | Lance Stout <lancestout@gmail.com> | 2012-07-27 10:45:52 -0700 |
---|---|---|
committer | Lance Stout <lancestout@gmail.com> | 2012-07-27 10:45:52 -0700 |
commit | c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce (patch) | |
tree | 88b7dabe06edbbfeb45403c06628230c18301458 /sleekxmpp/xmlstream/scheduler.py | |
parent | c9b2cf60431f415584c1d12a7855e0d2ac148ec4 (diff) | |
parent | e3fab66dfb27abdd8aa28a8d15367a490d4b42dd (diff) | |
download | slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.tar.gz slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.tar.bz2 slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.tar.xz slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.zip |
Merge branch 'master' into develop
Diffstat (limited to 'sleekxmpp/xmlstream/scheduler.py')
-rw-r--r-- | sleekxmpp/xmlstream/scheduler.py | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/sleekxmpp/xmlstream/scheduler.py b/sleekxmpp/xmlstream/scheduler.py index d98dc6c8..b3e50983 100644 --- a/sleekxmpp/xmlstream/scheduler.py +++ b/sleekxmpp/xmlstream/scheduler.py @@ -15,6 +15,7 @@ import time import threading import logging +import itertools from sleekxmpp.util import Queue, QueueEmpty @@ -156,17 +157,23 @@ class Scheduler(object): newtask = self.addq.get(True, 0.1) elapsed += 0.1 except QueueEmpty: - cleanup = [] self.schedule_lock.acquire() - for task in self.schedule: - if time.time() >= task.next: - updated = True - if not task.run(): - cleanup.append(task) + # select only those tasks which are to be executed now + relevant = itertools.takewhile( + lambda task: time.time() >= task.next, self.schedule) + # run the tasks and keep the return value in a tuple + status = map(lambda task: (task, task.run()), relevant) + # remove non-repeating tasks + for task, doRepeat in status: + if not doRepeat: + try: + self.schedule.remove(task) + except ValueError: + pass else: - break - for task in cleanup: - self.schedule.pop(self.schedule.index(task)) + # only need to resort tasks if a repeated task has + # been kept in the list. + updated = True else: updated = True self.schedule_lock.acquire() @@ -174,8 +181,7 @@ class Scheduler(object): self.schedule.append(newtask) finally: if updated: - self.schedule = sorted(self.schedule, - key=lambda task: task.next) + self.schedule.sort(key=lambda task: task.next) self.schedule_lock.release() except KeyboardInterrupt: self.run = False |