def __init__(self): self.alerted_propagators = SetQueue() self.propagators_ever_alerted = SetQueue() self._abort_process_stack = deque() self.last_value_of_run = None
class Scheduler: def __init__(self): self.alerted_propagators = SetQueue() self.propagators_ever_alerted = SetQueue() self._abort_process_stack = deque() self.last_value_of_run = None """ Initialize the scheduler, emptying its queues and registers. """ def initialize(self): debug("Initializing scheduler") self.alerted_propagators.clear() self.propagators_ever_alerted.clear() self._abort_process_stack.clear() self.last_value_of_run = None """ Alerts all propagators in `propagators`. Parameters: - `propagators`: a single `Propagator` object or a list of `Propagators objects. """ def alert_propagators(self, propagators): for p in listify(propagators): assert callable(p), "Alerting a non-procedure" self.propagators_ever_alerted.add(p) self.alerted_propagators.add(p) def alert_all_propagators(self): self.alert_propagators(self.propagators_ever_alerted) def abort_process(self, value): self.alerted_propagators.clear() #error("Aborting: {value}".format(**vars())) if self._abort_process_stack: self._abort_process_stack.pop()(value) else: self.last_value_of_run = value """ Pops and runs alerted propagators from the queue them until it is empty. """ def run(self): def with_process_abortion(thunk): def f(k): self._abort_process_stack.append(k) thunk() self._abort_process_stack.pop() return callcc(f) def run_alerted(): temp = list(self.alerted_propagators) self.alerted_propagators.clear() for propagator in list(temp): debug("Running {propagator}".format(**vars())) propagator() if self.alerted_propagators: run_alerted() debug("Running scheduler") if len(self.alerted_propagators): self.last_value_of_run = with_process_abortion(run_alerted) debug("Scheduler done") return self.last_value_of_run