def __init__(self, layer, cache, bbox=None, levels=None, tiles=None, threads=1, metadata={}, dry_run=False): self.metadata = metadata self.layer = layer self.bbox = bbox self.levels = levels self.fatal = False self.poolsize = threads self.duration = {"render": 0.0, "post-proc": 0.0, "save": 0.0} self.success_count = 0 self.failures = deque() self.tiles = tiles or self.init_grid() if dry_run: logger.info("tiles to be generated: %d" % len([t for t in self.tiles])) sys.exit() self.pool = Pool(self.poolsize, init, (self.layer, cache)) self.results = self.pool.imap_unordered(run, self.tiles) self.pool.close() # stats stats_dir = self.metadata.get("stats_dir", "/tmp/tileforge/stats") stats_interval = float(self.metadata.get("stats_interval", "2")) self.stats = Thread(target=self.write_status, args=(stats_dir, stats_interval)) # errors self.error_dir = self.metadata.get("error_dir", "/tmp/tileforge/errors") if mkdir(self.error_dir): self.error_logs = open(os.path.join(self.error_dir, self.layer.name + ".txt"), "a") self.error_logs.truncate(0) else: raise Exception("can't write errors to '%s'" % self.error_dir)
def write_status(self, dirname, interval): if not mkdir(dirname): logger.warning("can't write stats to '%s'" % dirname) return filename = os.path.join(dirname, self.layer.name) while True: values = "%d:%d:%d" % (self.success_count, len(self.failures), len(self.running())) stats = open(filename, "w") stats.write(values) stats.close() if self.running(): time.sleep(interval) else: # no more generators are running return