Was dir fehlt ist das gleichzeitige Starten mehrerer Tasks. Dein aktueller Code:
await say_hello()
await say_hello()
Das bedeutet: Warte auf say_hello() bis es komplett fertig ist, und erst danach starte den nächsten. Dadurch laufen die beiden Aufrufe nacheinander also nicht parallel oder asynchron. Wenn du möchtest, dass beide say_hello() Aufrufe gleichzeitig laufen, musst du sie als Tasks starten, z. B. mit asyncio.create_task().
import asyncio
import time
async def say_hello():
print("Hello...")
await asyncio.sleep(2)
print("...World!")
async def main():
task1 = asyncio.create_task(say_hello())
task2 = asyncio.create_task(say_hello())
await task1
await task2
start = time.time()
asyncio.run(main())
print(f"Duration: {time.time() - start}")
asyncio.create_task() startet beide say_hello() Funktionen quasi gleichzeitig. Dann wartest du mit await darauf, dass beide fertig sind. Die beiden await asyncio.sleep(2) laufen nun parallel, also insgesamt dauert das Ganze nur ca. 2 Sekunden, nicht 4. await func() wartet, bis die Funktion fertig ist. Wenn du mehrere async-Funktionen gleichzeitig starten willst, nutze asyncio.create_task() oder asyncio.gather().