Exemplo n.º 1
0
 def start(self):
     if not self.inputs:
         self.inputs = PointCache()
         self.inputs.configure({
             "name": "inputs",
             "period": 0,
             "polled": True,
             "parent": self
         })
     return super(CachingCalculator, self).start()
Exemplo n.º 2
0
 def start(self):
     if not self.inputs:
         self.inputs = PointCache()
         self.inputs.configure({"name": "inputs", "period": 0, 
                                "polled": True, "parent": self})
     return super(CachingCalculator, self).start()
Exemplo n.º 3
0
class CachingCalculator(Calculator):
    """
        Extension of Calculators which leverages Point Caches 
        to leverage Subscription Manager updates for input 
        values.
    """
    def __init__(self):
        self.ttl = 5
        self.inputs = None
        self.last_refresh = 0
        self.synclock = RLock()
        super(CachingCalculator, self).__init__()

    def start(self):
        if not self.inputs:
            self.inputs = PointCache()
            self.inputs.configure({
                "name": "inputs",
                "period": 0,
                "polled": True,
                "parent": self
            })
        return super(CachingCalculator, self).start()

    def refresh(self):
        self.inputs.refresh()
        self.last_refresh = uptime.secs()

    def since_refresh(self):
        return uptime.secs() - self.last_refresh

    def should_refresh(self):
        return self.since_refresh() > self.ttl

    def setup_context(self):
        running = self.inputs.is_running()
        if running:
            self.inputs.stop()
        for child in self.inputs.children_nodes():
            msglog.warn("Pruning input child: %s." % child)
            child.prune()
        context = super(CachingCalculator, self).setup_context()
        if running:
            self.inputs.start()
        return context

    def as_node_input(self, name, node):
        if not node.has_method("get"):
            # The above if statement fails when nodes don't resolve.
            raise ValueError("node has no 'get' method: %s" % node)
        source = as_node_url(node)
        if self.inputs.has_child(name):
            node = self.inputs.get_child(name)
            if source != node.source:
                raise ValueError("Input with name exists: %r" % name)
            msglog.warn("Input exists: %r, %r" % (name, source))
        else:
            running = self.inputs.is_running()
            if running:
                self.inputs.stop()
            node = CachedPoint()
            node.configure({
                "name": name,
                "source": source,
                "parent": self.inputs
            })
            if running:
                self.inputs.start()
        return super(CachingCalculator, self).as_node_input(name, node)

    def evaluate(self, *args, **kw):
        self.synclock.acquire()
        try:
            if self.should_refresh():
                self.refresh()
            result = super(CachingCalculator, self).evaluate(*args, **kw)
        finally:
            self.synclock.release()
        return result

    def _evaluate(self, value_map):
        try:
            answer = eval(self.compiled_statement, globals(), value_map)
        except:
            msglog.warn("%s evaluate failed with inputs: %r." %
                        (self, value_map))
            raise
        return answer
Exemplo n.º 4
0
class CachingCalculator(Calculator):
    """
        Extension of Calculators which leverages Point Caches 
        to leverage Subscription Manager updates for input 
        values.
    """
    def __init__(self):
        self.ttl = 5
        self.inputs = None
        self.last_refresh = 0
        self.synclock = RLock()
        super(CachingCalculator, self).__init__()
    def start(self):
        if not self.inputs:
            self.inputs = PointCache()
            self.inputs.configure({"name": "inputs", "period": 0, 
                                   "polled": True, "parent": self})
        return super(CachingCalculator, self).start()
    def refresh(self):
        self.inputs.refresh()
        self.last_refresh = uptime.secs()
    def since_refresh(self):
        return uptime.secs() - self.last_refresh
    def should_refresh(self):
        return self.since_refresh() > self.ttl
    def setup_context(self):
        running = self.inputs.is_running()
        if running:
            self.inputs.stop()
        for child in self.inputs.children_nodes():
            msglog.warn("Pruning input child: %s." % child)
            child.prune()
        context = super(CachingCalculator, self).setup_context()
        if running:
            self.inputs.start()
        return context
    def as_node_input(self, name, node):
        if not node.has_method("get"):
            # The above if statement fails when nodes don't resolve.
            raise ValueError("node has no 'get' method: %s" % node)
        source = as_node_url(node)
        if self.inputs.has_child(name):
            node = self.inputs.get_child(name)
            if source != node.source:
                raise ValueError("Input with name exists: %r" % name)
            msglog.warn("Input exists: %r, %r" % (name, source))
        else:
            running = self.inputs.is_running()
            if running:
                self.inputs.stop()
            node = CachedPoint()
            node.configure({"name": name, 
                            "source": source, 
                            "parent": self.inputs})
            if running:
                self.inputs.start()
        return super(CachingCalculator, self).as_node_input(name, node)
    def evaluate(self, *args, **kw):
        self.synclock.acquire()
        try:
            if self.should_refresh():
                self.refresh()
            result = super(CachingCalculator, self).evaluate(*args, **kw)
        finally:
            self.synclock.release()
        return result
    def _evaluate(self, value_map):
        try:
            answer = eval(self.compiled_statement, globals(), value_map)
        except:
            msglog.warn("%s evaluate failed with inputs: %r." % (self, value_map))
            raise
        return answer