def tasks2(self): self.running = True while self.running: self.update_event.clear() if not len(self.heap): self.update_event.wait() timeout = 0 task = None with self.heap_lock: runtime, delay, queue = self.heap[0] if runtime > time(): timeout = runtime - time() else : heappop(self, heap) try : task = queue.get_nowait() except Queue.Empty: pass else : queue.task_done() heappush(self.heap, (time() + delay, delay, queue)) if task: yield task self.update_event.wait(timeout)