diff --git a/backend/routes/osm.py b/backend/routes/osm.py index d2927ce..baf653a 100644 --- a/backend/routes/osm.py +++ b/backend/routes/osm.py @@ -30,6 +30,9 @@ _overpass_last_req = 0.0 _OVERPASS_MIN_DELAY = 2.0 # Sekunden zwischen Anfragen _OVERPASS_UA = 'BanYaro/1.0 (https://banyaro.app; dog-walking PWA; contact: mail@motocamp.de)' +# Referenzen auf laufende Hintergrund-Tasks — verhindert GC vor Abschluss +_bg_tasks: set = set() + OSM_QUERIES = { 'waste_basket': '[out:json][timeout:20];node["amenity"="waste_basket"]({bbox});out;', 'dog_park': '[out:json][timeout:25];(way["leisure"="dog_park"]({bbox});node["leisure"="dog_park"]({bbox});way["leisure"="park"]["dog"="yes"]({bbox});node["leisure"="park"]["dog"="yes"]({bbox}););out center;', @@ -177,11 +180,13 @@ async def get_pois( stale = _stale_tiles(type, tiles) if stale and not fast: - # Direkt in den Event-Loop einplanen — Antwort kommt sofort zurück + # Hintergrund-Task mit gespeicherter Referenz (GC-sicher) async def _bg_fetch(poi_type, stale_tiles): for (x, y) in stale_tiles: await _fetch_and_store_tile(poi_type, x, y) - asyncio.create_task(_bg_fetch(type, stale)) + task = asyncio.create_task(_bg_fetch(type, stale)) + _bg_tasks.add(task) + task.add_done_callback(_bg_tasks.discard) with db() as conn: reported = {