@burli,
das ist in diesem Fall richtig. Da du das Ergebnis im nächsten Funktionsaufruf verwenden willst, must du es aber nun einmal abwarten.
async Funktionen müssen immer mit "await" aufgerufen werden, da es sonst eine Fehlermeldung geben würde. Das geht so also auch gar nicht anders.
Parallelität ist dennoch möglich. Mit asyncio.gather().
Ich habe hier zwei Beispiele, die das hoffentlich verdeutlichen:
Code: Alles auswählen
import asyncio
import time
async def aaaa():
await asyncio.sleep(1)
return "AAAA"
async def bbbb():
await asyncio.sleep(1)
return "BBBB"
async def main():
while True:
start = time.perf_counter()
print(await aaaa())
print(await bbbb())
print(f"Dauer: {time.perf_counter()-start:.2f}s")
asyncio.run(main())
"""Ausgabe:
AAAA
BBBB
Dauer: 2.03s
AAAA
BBBB
Dauer: 2.01s
...
"""
Ein Durchlauf dauert 2 Sekunden, da beide Funktionen abgewartet werden.
Code: Alles auswählen
import asyncio
import time
async def aaaa():
await asyncio.sleep(1)
return "AAAA"
async def bbbb():
await asyncio.sleep(0.3)
return "BBBB"
async def main():
while True:
start = time.perf_counter()
responses = await asyncio.gather(*[aaaa(), bbbb()])
for response in responses:
print(response)
print(f"Dauer: {time.perf_counter()-start:.2f}s")
asyncio.run(main())
"""
Ausgabe:
AAAA
BBBB
Dauer: 1.01s
AAAA
BBBB
Dauer: 0.99s
...
"""
Jetzt dauert ein Durchlauf nur noch 1 Sekunde, weil beide async Funktionen "quasi parallel" laufen und die langsamere von beiden 1 Sekunde braucht.