Beispiel #1
0
    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)
Beispiel #2
0
    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