feat(app): verbeter parallelle data-ophaling en error handling
Het aantal workers voor de ThreadPoolExecutor is verhoogd van 3 naar 5 om de uitvoering te verbeteren. Nieuwe data-ophaalfuncties zijn toegevoegd, inclusief error handling met fallback-opties. De index methode gebruikt nu fetch_data_parallel voor efficiëntere API-calls en fouttolerantie. Dit verbetert de algehele responsiviteit en stabiliteit van de applicatie.
This commit is contained in:
parent
d378511401
commit
c3342496dd
@ -5,7 +5,7 @@ from config import *
|
||||
from hijridate import Gregorian
|
||||
from functools import lru_cache
|
||||
import time
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@ -13,7 +13,7 @@ app = Flask(__name__)
|
||||
CACHE_DURATION = 300 # 5 minuten cache voor API calls
|
||||
last_api_call = {}
|
||||
cached_data = {}
|
||||
executor = ThreadPoolExecutor(max_workers=3) # Voor parallelle API calls
|
||||
executor = ThreadPoolExecutor(max_workers=5) # Verhoogd naar 5 workers voor betere parallelle uitvoering
|
||||
|
||||
def get_cached_data(key, fetch_func, duration=CACHE_DURATION):
|
||||
"""Haal data uit cache of voer fetch_func uit als cache verlopen is"""
|
||||
@ -29,13 +29,70 @@ def get_cached_data(key, fetch_func, duration=CACHE_DURATION):
|
||||
return data
|
||||
|
||||
def fetch_data_parallel():
|
||||
"""Haal alle data parallel op"""
|
||||
"""Haal alle data parallel op met verbeterde error handling"""
|
||||
futures = {
|
||||
'weather': executor.submit(fetch_weather_data),
|
||||
'sonos': executor.submit(fetch_sonos_zones),
|
||||
'date': executor.submit(get_date_info)
|
||||
'date': executor.submit(get_date_info),
|
||||
'hadith': executor.submit(load_hadith),
|
||||
'prayer_times': executor.submit(fetch_prayer_times)
|
||||
}
|
||||
return {key: future.result() for key, future in futures.items()}
|
||||
|
||||
results = {}
|
||||
for key, future in futures.items():
|
||||
try:
|
||||
results[key] = future.result(timeout=5) # Timeout van 5 seconden per request
|
||||
except Exception as e:
|
||||
print(f"⚠️ Fout bij ophalen {key} data: {e}")
|
||||
results[key] = get_fallback_data(key)
|
||||
|
||||
return results
|
||||
|
||||
def get_fallback_data(key):
|
||||
"""Geef fallback data terug als API calls falen"""
|
||||
fallbacks = {
|
||||
'weather': {
|
||||
'temperature': '--',
|
||||
'feels_like': '--',
|
||||
'description': 'Weer niet beschikbaar',
|
||||
'humidity': '--',
|
||||
'wind_speed': '--',
|
||||
'icon': '01d'
|
||||
},
|
||||
'sonos': ['Woonkamer'],
|
||||
'date': get_date_info(), # Gebruik lokale functie als fallback
|
||||
'hadith': {
|
||||
"text": "De daden die Allah het meest liefheeft zijn degenen die regelmatig worden verricht, zelfs als ze klein zijn.",
|
||||
"bron": "Sahih al-Bukhari"
|
||||
},
|
||||
'prayer_times': {
|
||||
"Fajr": "06:00",
|
||||
"Zuhr": "12:30",
|
||||
"Asr": "15:00",
|
||||
"Maghrib": "17:30",
|
||||
"Isha": "19:00"
|
||||
}
|
||||
}
|
||||
return fallbacks.get(key, {})
|
||||
|
||||
@lru_cache(maxsize=1)
|
||||
def fetch_prayer_times():
|
||||
"""Haal gebedstijden op met caching"""
|
||||
try:
|
||||
res = requests.get(VUMG_API, timeout=5)
|
||||
res.raise_for_status()
|
||||
data = res.json()[0]
|
||||
|
||||
return {
|
||||
"Fajr": data.get("fajr_jamah", "00:00")[:5],
|
||||
"Zuhr": data.get("zuhr_jamah", "00:00")[:5],
|
||||
"Asr": data.get("asr_jamah", "00:00")[:5],
|
||||
"Maghrib": data.get("maghrib_jamah", "00:00")[:5],
|
||||
"Isha": data.get("isha_jamah", "00:00")[:5]
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"⚠️ Fout bij ophalen gebedstijden: {e}")
|
||||
return get_fallback_data('prayer_times')
|
||||
|
||||
# Voeg cache-control headers toe voor statische bestanden
|
||||
@app.after_request
|
||||
@ -274,62 +331,36 @@ def get_date_info():
|
||||
@app.route('/')
|
||||
def index():
|
||||
settings = load_settings()
|
||||
|
||||
# Haal alle data parallel op
|
||||
data = fetch_data_parallel()
|
||||
|
||||
# Verwerk gebedstijden
|
||||
gebedstijden = apply_prayer_offsets(data['prayer_times'], settings)
|
||||
|
||||
# Bepaal volgende gebed
|
||||
now = datetime.now().strftime('%H:%M')
|
||||
next_time = "Onbekend"
|
||||
next_name = "Onbekend"
|
||||
debug_data = {}
|
||||
gebedstijden = {}
|
||||
hadith = load_hadith()
|
||||
weather = fetch_weather_data()
|
||||
date_info = get_date_info()
|
||||
|
||||
try:
|
||||
res = requests.get(VUMG_API)
|
||||
res.raise_for_status()
|
||||
data = res.json()[0]
|
||||
for naam, tijd in gebedstijden.items():
|
||||
if tijd > now:
|
||||
next_time = tijd
|
||||
next_name = naam
|
||||
break
|
||||
else:
|
||||
next_time = list(gebedstijden.values())[0]
|
||||
next_name = list(gebedstijden.keys())[0]
|
||||
|
||||
gebedstijden = {
|
||||
"Fajr": data.get("fajr_jamah", "00:00")[:5], # Haal seconden weg
|
||||
"Zuhr": data.get("zuhr_jamah", "00:00")[:5], # Haal seconden weg
|
||||
"Asr": data.get("asr_jamah", "00:00")[:5], # Haal seconden weg
|
||||
"Maghrib": data.get("maghrib_jamah", "00:00")[:5], # Haal seconden weg
|
||||
"Isha": data.get("isha_jamah", "00:00")[:5] # Haal seconden weg
|
||||
}
|
||||
|
||||
# Pas offsets toe op gebedstijden
|
||||
gebedstijden = apply_prayer_offsets(gebedstijden, settings)
|
||||
|
||||
now = datetime.now().strftime('%H:%M')
|
||||
for naam, tijd in gebedstijden.items():
|
||||
if tijd > now:
|
||||
next_time = tijd
|
||||
next_name = naam
|
||||
break
|
||||
else:
|
||||
next_time = list(gebedstijden.values())[0]
|
||||
next_name = list(gebedstijden.keys())[0]
|
||||
|
||||
debug_data = {
|
||||
"api_response": data,
|
||||
"gebedstijden": gebedstijden,
|
||||
"now": now,
|
||||
"next_time": next_time,
|
||||
"next_name": next_name
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
print("❌ Fout bij ophalen/verwerken van gebedstijden:", e)
|
||||
|
||||
dua = "اللّهُمَّ اجْعَلْ صَلاتِي نُورًا"
|
||||
return render_template('index.html',
|
||||
next_time=next_time,
|
||||
next_name=next_name,
|
||||
dua=dua,
|
||||
hadith=hadith,
|
||||
gebedstijden=gebedstijden,
|
||||
debug=debug_data,
|
||||
settings=settings,
|
||||
weather=weather,
|
||||
date_info=date_info)
|
||||
next_time=next_time,
|
||||
next_name=next_name,
|
||||
dua="اللّهُمَّ اجْعَلْ صَلاتِي نُورًا",
|
||||
hadith=data['hadith'],
|
||||
gebedstijden=gebedstijden,
|
||||
settings=settings,
|
||||
weather=data['weather'],
|
||||
date_info=data['date'])
|
||||
|
||||
@app.route('/instellingen', methods=['GET', 'POST'])
|
||||
def instellingen():
|
||||
|
||||
1
done
1
done
@ -78,3 +78,4 @@ Wed May 28 14:02:31 CEST 2025: Debug tijd synchronisatie toegevoegd tussen debug
|
||||
2025-05-29 17:03:53 - Chrome translate banner uitgeschakeld: --disable-translate, --disable-features=Translate, --lang=nl flags toegevoegd aan beide setup scripts
|
||||
2025-05-29 17:07:38 - Browser gewijzigd van Chromium naar Puffin: 4x sneller, 80MB minder RAM, cloud rendering voor betere Pi3 prestaties
|
||||
2025-05-29 17:28:00 - Terug naar Chromium: Puffin werkte niet goed op Pi32025-05-29 21:32:16 - Geoptimaliseerde index.html en adzkaar.html voor betere performance
|
||||
2025-05-29 21:39:45 - App.py geoptimaliseerd: verbeterde parallelle data ophaling, caching en error handling toegevoegd
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user