Python 3.5 async/await-mit echten code-Beispiel
Gelesen habe ich Tonnen von Artikeln und Tutorials über Python 3.5 async/await Sache. Ich muss sagen, ich bin ziemlich verwirrt, weil einige verwenden get_event_loop() und run_until_complete(), einige verwenden ensure_future(), einige verwenden asyncio.wait(), und einige nutzen call_soon().
Es scheint, wie ich haben eine Menge zur Auswahl, aber ich habe keine Ahnung, ob Sie völlig identisch sind, oder gibt es Fälle, wo die Verwendung von Schleifen und es gibt Fälle, wo Sie verwenden Sie wait () auf.
Aber die Sache ist, alle Beispiele arbeiten mit asyncio.sleep()
als simulation des realen langsame operation, gibt einen erwartbaren Objekt. Sobald ich versuche zu tauschen dieser Linie für einige echte code die ganze Sache nicht. Was zum Teufel sind die Unterschiede zwischen den Ansätzen oben geschrieben und wie sollte ich laufen, eine third-party-Bibliothek, die nicht bereit sind, für async/await. Ich verwende die Quandl service zu Holen, Bestand.
import asyncio
import quandl
async def slow_operation(n):
# await asyncio.sleep(1) # Works because it's await ready.
await quandl.Dataset(n) # Doesn't work because it's not await ready.
async def main():
await asyncio.wait([
slow_operation("SIX/US9884981013EUR4"),
slow_operation("SIX/US88160R1014EUR4"),
])
# You don't have to use any code for 50 requests/day.
quandl.ApiConfig.api_key = "MY_SECRET_CODE"
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Ich hoffe, Sie bekommen den Punkt, wie verloren ich mich fühle und wie einfach die Sache, die ich haben möchte, parallel laufen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn eine Drittanbieter-library ist nicht kompatibel mit
async/await
dann offensichtlich können Sie es nicht verwenden bequem. Es gibt zwei Fälle:Lassen Sie uns sagen, dass die Funktion in der library ist asynchron und es gibt Ihnen einen Rückruf, z.B.
Also können Sie tun:
In diesem Fall können Sie wickeln Sie solche Funktionen in die asyncio-Protokoll wie diese:
(verwenden Sie
future.set_exception(exc)
auf eine Ausnahme)Dann rufen Sie einfach an, dass der wrapper in einigen
async
Funktion mitawait
:Beachten Sie, dass
await
funktioniert mit jedemFuture
Objekt. Sie müssen nicht erklärenwrapper
alsasync
.Wenn die Funktion in der library ist synchron, dann können Sie es in einem separaten thread (wahrscheinlich würden Sie einige thread-pool für die). Der gesamte code könnte wie folgt Aussehen:
Wenn Sie nicht verwenden können threads aus welchem Grund auch immer dann mit solchen Bibliothek macht einfach gesamte asynchrone code sinnlos.
Beachten Sie jedoch, dass die Verwendung von synchron-Bibliothek mit async ist wahrscheinlich eine schlechte Idee. Sie nicht viel und doch Sie erschweren den code viel.
.run_in_executor
- Funktion sorgt dafür, dass die Rückgabe-Werte und exception handling. Keine Notwendigkeit, dies zu tun manuell.asyncio.wait()
zu warten, bis alle von Ihnen. Am Ende können Sie eine Schleife durch futures und abrufen der Ergebnisse durch den Aufruffuture.result()
. Finden Sie den aktualisierten code. Beachten Sie, dass.run_in_executor
gibt bereits ein future-Objekt, keine Notwendigkeit, wickeln Sie es.