OSM: create_task GC-sicher — Task-Referenz in _bg_tasks speichern

asyncio.create_task ohne gespeicherte Referenz wird vom Garbage Collector
sofort gelöscht bevor der Task läuft (dokumentiertes Python-Verhalten).
Fix: _bg_tasks-Set hält Referenz bis done_callback sie wieder entfernt.
This commit is contained in:
rene 2026-04-25 22:24:38 +02:00
parent ddff1d3571
commit eaf7884a1f

View file

@ -30,6 +30,9 @@ _overpass_last_req = 0.0
_OVERPASS_MIN_DELAY = 2.0 # Sekunden zwischen Anfragen _OVERPASS_MIN_DELAY = 2.0 # Sekunden zwischen Anfragen
_OVERPASS_UA = 'BanYaro/1.0 (https://banyaro.app; dog-walking PWA; contact: mail@motocamp.de)' _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 = { OSM_QUERIES = {
'waste_basket': '[out:json][timeout:20];node["amenity"="waste_basket"]({bbox});out;', '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;', '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) stale = _stale_tiles(type, tiles)
if stale and not fast: 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): async def _bg_fetch(poi_type, stale_tiles):
for (x, y) in stale_tiles: for (x, y) in stale_tiles:
await _fetch_and_store_tile(poi_type, x, y) 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: with db() as conn:
reported = { reported = {