import time
from datetime import datetime
+from decorators import invokation_logged
+
class renderer(object):
"""Base class for something that can render."""
+
+ @invokation_logged
def render(self):
pass
+ def get_name(self):
+ return self.__class__.__name__
+
+
class abstaining_renderer(renderer):
"""A renderer that doesn't do it all the time."""
+
def __init__(self, name_to_timeout_dict):
- self.name_to_timeout_dict = name_to_timeout_dict;
+ self.name_to_timeout_dict = name_to_timeout_dict
self.last_runs = {}
for key in name_to_timeout_dict:
self.last_runs[key] = 0
def should_render(self, keys_to_skip):
now = time.time()
for key in self.name_to_timeout_dict:
- if key in keys_to_skip:
- continue
- if (now - self.last_runs[key]) > self.name_to_timeout_dict[key]:
+ if (
+ (now - self.last_runs[key]) > self.name_to_timeout_dict[key]
+ ) and key not in keys_to_skip:
return key
return None
def render(self):
- tries = {}
+ tries_per_key = {}
keys_to_skip = set()
while True:
key = self.should_render(keys_to_skip)
if key == None:
break
- if key in tries:
- tries[key] += 1
+
+ if key in tries_per_key:
+ tries_per_key[key] += 1
else:
- tries[key] = 0
+ tries_per_key[key] = 0
- if tries[key] > 5:
- print('Too many retries for "%s", giving up for now' % key)
+ if tries_per_key[key] >= 3:
+ print(
+ 'renderer: Too many failures for "%s.%s", giving up'
+ % (self.get_name(), key)
+ )
keys_to_skip.add(key)
else:
- msg = 'renderer: periodic render event for "%s"' % key
- if (tries[key] > 1):
- msg = msg + " (try %d)" % tries[key]
+ msg = 'renderer: executing "%s.%s"' % (self.get_name(), key)
+ if tries_per_key[key] > 1:
+ msg = msg + " (retry #%d)" % tries_per_key[key]
print(msg)
- if (self.periodic_render(key)):
+ if self.periodic_render(key):
self.last_runs[key] = time.time()
+ @invokation_logged
def periodic_render(self, key):
pass
+
class debuggable_abstaining_renderer(abstaining_renderer):
def __init__(self, name_to_timeout_dict, debug):
- super(debuggable_abstaining_renderer, self).__init__(name_to_timeout_dict);
+ super(debuggable_abstaining_renderer, self).__init__(name_to_timeout_dict)
self.debug = debug
def debug_prefix(self):
- return "none"
+ return self.get_name()
def being_debugged(self):
return self.debug
# current date and time
now = datetime.now()
timestamp = now.strftime("%d-%b-%Y (%H:%M:%S.%f)")
- print "%s(%s): %s" % (self.debug_prefix(), timestamp, msg)
+ print("%s(%s): %s" % (self.debug_prefix(), timestamp, msg))
except Exception as e:
- print "Exception in debug_print!"
- print e
+ print("Exception in debug_print!")
+ print(e)