====== LU03.A10 - Timer und API-Call ======
In dieser Übung werden Sie die Kraft der Asynchronität in Python erleben. Ihre Aufgabe ist es, einen asynchronen Timer zu erstellen, der alle 3 Sekunden einen API-Aufruf ausführt. Gleichzeitig sollte ein separater asynchroner Prozess eine andere Aufgabe durchführen, ohne durch den API-Aufruf unterbrochen zu werden.
==== Detaillierte Aufgabenstellung ====
**API-Aufruf:** Ihr Programm sollte alle 3 Sekunden einen asynchronen Aufruf an die folgende URL machen: https://run.mocky.io/v3/685db531-06e7-4d66-bbf6-99de9f2feab3?mocky-delay=3000ms . Nachdem eine Antwort vom Server erhalten wurde, sollte diese in der Konsole ausgegeben werden.
**Zweite Aufgabe:** Parallel zum API-Aufruf sollte Ihr Programm eine andere asynchrone Aufgabe durchführen. Diese Aufgabe sollte darin bestehen, jede Sekunde eine Zahl auszugeben, die ständig um 1 erhöht wird (ein asynchroner Timer).
**Hinweis:** Verwenden Sie asyncio in Kombination mit einer Bibliothek wie httpx für asynchrone HTTP-Anfragen.
==== Erwartetes Verhalten ====
Wenn Sie Ihr Programm ausführen, sollten Sie sehen, dass der Timer jede Sekunde hochzählt. Alle 3 Sekunden wird Ihr Programm eine Pause einlegen, um auf die Antwort des API-Aufrufs zu warten. Nachdem die Antwort erhalten wurde, wird sie in der Konsole angezeigt, und der Timer fährt ohne Unterbrechung fort.
==== Beispiel ====
Ein möglicher Output könnte wie folgt aussehen:
0
1
2
3
API Response:
4
...
==== Vorlage ====
import asyncio
import httpx
def api_response_callback(response_data):
"""
Callback-Funktion, die aufgerufen wird, nachdem die API-Antwort empfangen wurde.
Args:
- response_data: Die Daten, die von der API empfangen wurden.
Returns:
- None, da die Daten direkt in der Konsole ausgegeben werden.
"""
#TODO: Hier die Daten verarbeiten
async def fetch_data_from_api(callback):
"""
Diese Funktion ruft asynchron alle 3 Sekunden eine API ('https://run.mocky.io/v3/685db531-06e7-4d66-bbf6-99de9f2feab3?mocky-delay=3000ms') auf, die eine
Verzögerung von 3 Sekunden simuliert. Nachdem die Daten von der API abgerufen wurden, wird der bereitgestellte
Callback mit den Daten aufgerufen.
Args:
- callback: Die Callback-Funktion, die aufgerufen wird, nachdem die API-Daten empfangen wurden.
Returns:
- None, da die Daten an die Callback-Funktion weitergegeben werden.
"""
# TODO: Hier in einer Endlosschleife die API aufrufen und die Daten an die Callback-Funktion übergeben
async def async_timer():
"""
Diese Funktion fungiert als asynchroner Timer, der jede Sekunde hochzählt und den aktuellen Wert ausgibt.
Sie verwendet `asyncio.sleep` für die Verzögerung und führt eine endlose Schleife aus, die den Zähler jede Sekunde erhöht.
Returns:
- None, da der Zählerstand direkt in der Konsole ausgegeben wird.
"""
#TODO: Hier den Timer implementieren
async def main():
"""
Hauptfunktion, die beide asynchrone Funktionen, `fetch_data_from_api` und `async_timer`, parallel ausführt.
Sie verwendet `asyncio.create_task` um die beiden Funktionen als separate, gleichzeitig laufende Tasks zu starten.
Returns:
- None, da alle Ausgaben direkt in den jeweiligen Funktionen erfolgen.
"""
api_task = asyncio.create_task(fetch_data_from_api(api_response_callback))
timer_task = asyncio.create_task(async_timer())
await api_task
await timer_task
if __name__ == '__main__':
asyncio.run(main())
----
https://github.com/templates-python/m323-lu03-a10-timer
[[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi