overpass_old/main.py
2026-04-21 22:24:56 +02:00

93 lines
3.1 KiB
Python

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