Ich versuche, die Korotinen in Python (und im Allgemeinen) zu verstehen. Ich habe über die Theorie, das Konzept und ein paar Beispiele gelesen, aber ich kämpfe immer noch. Ich verstehe das asynchrone Modell (habe ein bisschen Twisted gemacht), aber noch keine Coroutines.Wie ist das eine Coroutine?
One tutorial gibt dies als Koroutine Beispiel (ich ein paar Änderungen vorgenommen, mein Problem zu veranschaulichen):
async def download_coroutine(url, number):
"""
A coroutine to download the specified url
"""
request = urllib.request.urlopen(url)
filename = os.path.basename(url)
print("Downloading %s" % url)
with open(filename, 'wb') as file_handle:
while True:
print(number) # prints numbers to view progress
chunk = request.read(1024)
if not chunk:
print("Finished")
break
file_handle.write(chunk)
msg = 'Finished downloading {filename}'.format(filename=filename)
return msg
Das mit diesem
ausgeführt wirdcoroutines = [download_coroutine(url, number) for number, url in enumerate(urls)]
completed, pending = await asyncio.wait(coroutines)
am Generator Blick Koroutinen Beispiele kann ich siehe einige yield
Aussagen. Hier gibt es nichts, und urllib ist synchron, AFAIK.
Da der Code asynchron sein soll, erwarte ich auch eine Reihe von verschachtelten Zahlen. (1, 4, 5, 1, 2, ..., "Fertig", ...). Was ich sehe, ist eine einzelne Zahl, die in einer Finished
endet und dann eine andere (3, 3, 3, 3, ... "Fertig", 1, 1, 1, 1, ..., "Beendet"). ..).
An diesem Punkt bin ich versucht zu sagen, das Tutorial ist falsch, und das ist eine Coroutine, nur weil Async in Front hat.
Ihre ist eine Co-Routine * nur *, weil Sie 'async def' verwendet haben. Es ist nicht sehr kooperativ, da es anderen Co-Routinen niemals nachgibt. Also ja, deine Analyse ist korrekt. –
Ich habe einen Fehler gemacht, als ich das Tutorial ursprünglich geschrieben habe. Es wurde aktualisiert, um 'aiohttp' zu verwenden –