Ich habe Probleme beim Kombinieren von Async-Generatoren und tatsächlich laufen sie. Das liegt daran, dass ich sie nur durch eine Ereignisschleife gefunden habe, die einen iterierbaren und keinen Generator liefert. Lassen Sie mich das mit einem einfachen Beispiel illustrieren:Wie füge ich Async-Generatoren in einen Python 3.5000-Generator ein?
Nehmen wir an, ich habe eine Funktion google_search, die google scrappt (ich benutze die API nicht absichtlich). Es nimmt einen Suchstring auf und gibt einen Generator von Suchergebnissen zurück. Dieser Generator endet nicht, wenn die Seite zu Ende ist, die Funktion geht weiter zur nächsten Seite. Deshalb ist die GOOGLE_SEARCH Funktion einen möglicherweise fast endlos Generator liefert (es wird technisch immer am Ende aber oft kann man Millionen von Treffern für eine Suche auf Google erhalten)
def google_search(search_string):
# Basically uses requests/aiohttp and beautifulsoup
# to parse the resulting html and yield search results
# Assume this function works
......
Okay, so dass ich jetzt eine Funktion machen will, das mir erlaubt, um über mehrere google_search Generatoren zu iterieren. Ich würde so etwas wie dies mag:
def google_searches(*search_strings):
for results in zip(google_search(query) for query in search_strings):
yield results
Auf diese Weise habe ich eine einfache for-Schleife verwenden können google_searches um sich zu entspannen und meine Ergebnisse. Und der obige Code funktioniert gut, ist aber für eine ziemlich große Anzahl von Suchvorgängen sehr langsam. Der Code sendet eine Anfrage für die erste Suche, dann die zweite und so weiter, bis schließlich Ergebnisse erzielt werden. Ich möchte das (viel) beschleunigen. Meine erste Idee ist es, google_searches zu einer asynchronen Funktion zu machen (ich benutze python 3.6.3 und kann abwarten/async usw. verwenden). Dies erzeugt dann einen asynchronen Generator, der in Ordnung ist, aber ich kann ihn nur in einer anderen asynchronen Funktion oder einer Ereignisschleife ausführen. Und das Ausführen in einer Ereignisschleife mit run_until_complete (loop.gather (...)) gibt eine Liste von Ergebnissen anstelle eines normalen Generators zurück, was den Zweck zunichte macht, da wahrscheinlich zu viele Suchergebnisse in einer Liste enthalten sind.
Wie kann ich die google_searches-Funktion schneller machen (vorzugsweise async-Code verwenden, aber alles ist willkommen), indem Sie Anfragen asynchron ausführen, während Sie immer noch ein Vanilla-Generator sein müssen? Vielen Dank im Voraus!
Warum der Downvote? Ist meine Frage nicht richtig oder nicht spezifisch? Es macht mir nichts aus dem Downvote, aber ich würde gerne wissen, was falsch ist, damit ich mich verbessern kann. Vielen Dank. –