93 lines
3.1 KiB
Python
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 |