from flask import Flask, Response, abort, request from parsers.nvidia import NvidiaParser from urllib.parse import urlparse import os, time, threading class ParserData: parser = None rss = None time = None lock = threading.Lock() def __init__(self, parser): self.parser = parser app = Flask(__name__) parsers = [ParserData(NvidiaParser())] def getCachePath(parser): path = './_cache/' + parser.__class__.__name__ return path def checkParserCache(parser): path = getCachePath(parser.parser) try: os.path.getmtime(path) with open(path, 'r') as f: parser.rss = f.read() except: os.makedirs(os.path.dirname(path), exist_ok=True) open(path, 'w').close() return True filetime = os.path.getmtime(path) currtime = time.time() parser.time = filetime return (currtime - filetime) > parser.parser.CACHE_TIMEOUT def updateParserAndCache(parser): rss = parser.parser.getRss() with parser.lock: parser.rss = rss parser.time = time.time() with open(getCachePath(parser.parser), 'w') as f: f.write(parser.rss.decode('utf-8')) def runParserWorker(parser): if checkParserCache(parser): updateParserAndCache(parser) while True: nextmark = parser.time + parser.parser.CACHE_TIMEOUT sleepfor = nextmark - time.time() if sleepfor > 0: time.sleep(nextmark - time.time()) updateParserAndCache(parser) def runParserWorkers(): for parser in parsers: threading.Thread(target=runParserWorker, args=(parser,)).start() indexPage = """