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 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()
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
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