コード例 #1
0
 def __init__(self):
     self.alerted_propagators = SetQueue()
     self.propagators_ever_alerted = SetQueue()
     self._abort_process_stack = deque()
     self.last_value_of_run = None
コード例 #2
0
ファイル: core.py プロジェクト: lucastx/propagator.py
 def __init__(self):
     self.alerted_propagators = SetQueue()
     self.propagators_ever_alerted = SetQueue()
     self._abort_process_stack = deque()
     self.last_value_of_run = None
コード例 #3
0
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
コード例 #4
0
ファイル: core.py プロジェクト: lucastx/propagator.py
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