ich bin relativ neu in Python und wollte mich ein wenig mit "async await" vertraut machen. Ich bin mehr in Javascript zu Hause, dort gibt es das auch und ich kann ganz gut damit umgehen.
Die Aufgabe ist folgende: Es gibt eine ganze Reihe von API-Abfragen, sagen wir 9. In Wirklichkeit viel mehr, daher wollte ich sie zum Teil asynchron abfragen, also z. B. jeweils 3 synchron und diese Blöcke dann asynchron. Damit die Wartezeit nicht zu lang wird. Zusätzlich gibt es zu jeder Abfrage noch eine ID, die wieder zur Verfügung stehen muss, wenn die Antwort vom Server da ist.
Den Server habe ich mit einem PHP-Skript simuliert:
Code: Alles auswählen
<?php
sleep(1);
echo '{"param1":' . $_POST['param1'] . '}'
?>
Code: Alles auswählen
import asyncio
import sys
import requests
params = [1, 2, 3, 4, 5, 6, 7, 8, 9]
ids = [11, 12, 13, 14, 15, 16, 17, 18, 19]
url = r'http://localhost//_python/async-await/the-api.php'
// Get 3 requests synchronously:
async def getThem(url, params2, ids2):
idx2 = 0
for param in params2:
response = requests.post(url, data={'param1': param})
print(response.json(), ids2[idx2])
idx2 += 1
idx = 0
params2 = []
ids2 = []
// Prepare blocks of 3 params and IDs each
// and get data from API
for param in params:
params2.append(param)
ids2.append(ids[idx])
idx += 1
if (idx % 3) == 0:
print(idx, params2)
asyncio.run(getThem(url, params2, ids2))
params2 = []
ids2 = []
Ich habe dann noch viel nachgelesen, vor allem bei Stackoverflow und Versuche mit gather unternommen aber bin nicht zum Ziel gekommen, immer wurden die Abfrage nacheinander abgewickelt.
Erst als ich versucht habe, für jede Abfrage einen Thread zu starten, hat es funktioniert:
Code: Alles auswählen
def getThem(url, params2, ids2):
idx2 = 0
for param in params2:
response = requests.post(url, data={'param1': param})
print(str(response.json())+' ' + str(ids2[idx2]))
idx2 += 1
idx = 0
params2 = []
ids2 = []
for param in params:
params2.append(param)
ids2.append(ids[idx])
idx += 1
if (idx % 3) == 0:
print(idx, params2)
download_thread = threading.Thread(
target=getThem, name="Downloader", args=[url, params2, ids2])
download_thread.start()
params2 = []
ids2 = []
Beste Grüße - Ulrich