import logging from utils import store_to_disk from config import QUERY, OUTPUT_DIR from worker import run_seriell, run_threads, run_parallel # --------------------------------------------------------------------------- # Logging konfigurieren # --------------------------------------------------------------------------- # Erinnerung: Log-Levels -> DEBUG, INFO, WARNING, ERROR, CRITICAL logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", datefmt="%H:%M:%S", ) logger = logging.getLogger(__name__) # --------------------------------------------------------------------------- # Hauptlogik # --------------------------------------------------------------------------- def main() -> None: query_name = list(QUERY.keys())[0] query = QUERY[query_name] logger.info("=== Seriell ===") overall_s = run_seriell(query) logger.info("=== Multiprocessing ===") overall_p = run_parallel(query) logger.info("=== ThreadPoolExecutor ===") overall_t = run_threads(query) try: saved_path = store_to_disk( results=overall_p, poi_type=query_name, output_dir=OUTPUT_DIR, ) logger.info(f"Ergebnisse gespeichert: {saved_path}") except OSError as e: logger.error(f"Fehler beim Speichern:{e}") logger.info("Fertig.") if __name__ == "__main__": main() # Was ist passiert? # * Wir haben zusätzlich Multithreating-Code implementiert # * Die Dekorator-Funktion in utils.py (timer) stoppt und logt die Zeit der dekorierten Funktionen, ohne deren Code # zu verändern. Das ermöglicht uns einen einfachen Zeitvergleich zwischen den einzelnen Funktionen # * Auslagerung von BBOXEN, OUTPUT_DIR, QUERY nach config.py, weil sie sowohl in main.py als auch in worker.py gebraucht # werden. Wären sie in main.poy verblieben, hätten wir Probleme mit einem circular-Import bekommen... # Erkenntnisse: # Programmfluss: # main() — läuft immer sequenziell # │ # ├── run_seriell() # │ ├── fetch SW ──► wartet # │ ├── fetch SO ──► wartet # │ ├── fetch NW ──► wartet # │ └── fetch NO ──► wartet → return → main() macht weiter # │ # ├── run_parallel() # │ ├── fetch SW ─┐ # │ ├── fetch SO ├─ gleichzeitig # │ ├── fetch NW │ in Prozessen # │ └── fetch NO ─┘ # │ Pool.map() blockiert bis ALLE fertig → return → main() macht weiter # │ # ├── run_threads() # │ ├── fetch SW ─┐ # │ ├── fetch SO ├─ gleichzeitig # │ ├── fetch NW │ in Threads # │ └── fetch NO ─┘ # │ as_completed() blockiert bis ALLE fertig → return → main() macht weiter # │ # └── store_to_disk() ← erst hier, garantiert # TASK: # * Bis jetzt speichern wir die Resultate als .json-File auf unserer Festplatte. Als nächstes wollen wir # die Resultate in einer sqlite-Datenbank ablegen