Ich habe das Beispiel in der Dokumentation der Anforderungsbibliothek für Python ausprobiert .
Mit async.map(rs)
erhalte ich die Antwortcodes, möchte aber den Inhalt jeder angeforderten Seite abrufen. Dies funktioniert beispielsweise nicht:
out = async.map(rs)
print out[0].content
requests-threads
es jetzt existiert.Antworten:
Hinweis
Die folgende Antwort gilt nicht für Anfragen v0.13.0 +. Die asynchrone Funktionalität wurde nach dem Schreiben dieser Frage in Grequests verschoben . Allerdings konnte man nur ersetzen
requests
mitgrequests
unten und es sollte funktionieren.Ich habe diese Antwort so belassen, wie sie ist, um die ursprüngliche Frage zu reflektieren, bei der es um die Verwendung von Anforderungen <v0.13.0 ging.
Um mehrere Aufgaben
async.map
asynchron auszuführen , müssen Sie:async.map
eine Liste aller Anfragen / Aktionen aufBeispiel:
quelle
from grequests import async
funktioniert nicht .. und diese Definition von etwas funktioniert für michdef do_something(response, **kwargs):
, ich finde es von stackoverflow.com/questions/15594015/…from requests import async
durchimport grequests as async
arbeitete für mich.async
ist jetzt ein eigenständiges Modul :grequests
.Siehe hier: https://github.com/kennethreitz/grequests
Und da: Ideale Methode zum Senden mehrerer HTTP-Anfragen über Python?
Installation:
Verwendung:
Bauen Sie einen Stapel:
Senden Sie den Stapel
Ergebnis sieht aus wie
Grequests scheinen keine Einschränkung für gleichzeitige Anforderungen festzulegen, dh wenn mehrere Anforderungen an denselben Server gesendet werden.
quelle
results = grequests.map(rs)
den Code nach dieser Zeile blockieren lasse , kann ich den asynchronen Effekt sehen?Ich habe sowohl Anfragen-Futures als auch Grequests getestet . Grequests sind schneller, bringen aber Affen-Patches und zusätzliche Probleme mit Abhängigkeiten mit sich. Anfragen-Futures sind um ein Vielfaches langsamer als Grequests. Ich habe beschlossen, meine eigenen und einfach verpackten Anfragen in ThreadPoolExecutor zu schreiben, und es war fast so schnell wie Grequests, aber ohne externe Abhängigkeiten.
quelle
Vielleicht ist Anfragen-Futures eine andere Wahl.
Es wird auch in empfohlen Office - Dokument . Wenn Sie nicht gevent einbeziehen möchten, ist es eine gute.
quelle
ThreadPoolExecutor(max_workers=10)
Ich habe viele Probleme mit den meisten Antworten - sie verwenden entweder veraltete Bibliotheken, die mit eingeschränkten Funktionen portiert wurden, oder bieten eine Lösung mit zu viel Magie bei der Ausführung der Anforderung, was die Fehlerbehandlung erschwert. Wenn sie nicht in eine der oben genannten Kategorien fallen, sind sie Bibliotheken von Drittanbietern oder veraltet.
Einige der Lösungen funktionieren nur in http-Anfragen, aber die Lösungen sind für jede andere Art von Anfrage nicht geeignet, was lächerlich ist. Eine hochgradig kundenspezifische Lösung ist hier nicht erforderlich.
Die einfache Verwendung der in Python integrierten Bibliothek
asyncio
reicht aus, um asynchrone Anforderungen jeglicher Art auszuführen und eine ausreichende Fluidität für die komplexe und benutzerspezifische Fehlerbehandlung bereitzustellen.Wie es funktioniert ist einfach. Sie erstellen eine Reihe von Aufgaben, die asynchron ausgeführt werden sollen, und fordern dann eine Schleife auf, diese Aufgaben auszuführen und nach Abschluss zu beenden. Keine zusätzlichen Bibliotheken, die nicht gewartet werden müssen, keine mangelnde Funktionalität erforderlich.
quelle
async
. Dann können Sie zum Beispiel tunawait response = requests.get(URL)
. Nein?requests
kaum schneller (und in einigen Fällen langsamer) ist als das synchrone Aufrufen einer Liste von URLs. Das Anfordern eines Endpunkts, der 3 Sekunden benötigt, um 10 Mal mit der oben beschriebenen Strategie zu antworten, dauert etwa 30 Sekunden. Wenn Sie echteasync
Leistung wünschen , müssen Sie so etwas wie verwendenaiohttp
.Ich weiß, dass dies für eine Weile geschlossen wurde, aber ich dachte, es könnte nützlich sein, eine andere asynchrone Lösung zu bewerben, die auf der Anforderungsbibliothek basiert.
Die Dokumente finden Sie hier: http://pythonhosted.org/simple-requests/
quelle
quelle
Wenn Sie asyncio verwenden möchten,
requests-async
bietet es async / await-Funktionen fürrequests
- https://github.com/encode/requests-asyncquelle
Ich verwende seit einiger Zeit Python-Anforderungen für asynchrone Aufrufe für die Gistub-API.
Ein Beispiel finden Sie im Code hier:
https://github.com/davidthewatson/flasgist/blob/master/views.py#L60-72
Dieser Python-Stil ist vielleicht nicht das klarste Beispiel, aber ich kann Ihnen versichern, dass der Code funktioniert. Lassen Sie mich wissen, wenn dies für Sie verwirrend ist, und ich werde es dokumentieren.
quelle
Es ist ein weiteres Paket mit dem Namen fgrequests verfügbar .
Es ist eine Alternative zu Grequests. Es ist schneller als
grequests
. Der Grund dafürfgrequests
ist, dass Threading für gleichzeitige Anforderungen verwendet wird. Sie können Ihr eigenes Parallelitätslimit entsprechend der Leistung Ihres Systems festlegen. Es hat auch eine gute Dokumentation. Bietet auch fast alle Funktionen der Python-requests
Bibliothek.Ich hoffe, Ihnen wird das in beiden
(features & speed)
Szenarien gefallen .quelle
Sie können dafür verwenden
httpx
.Wenn Sie eine funktionale Syntax wünschen, wird diese von der Gamla Lib umschlossen
get_async
.Dann können Sie tun
Das
10
ist das Timeout in Sekunden.(Haftungsausschluss: Ich bin sein Autor)
quelle
respx
zum Verspotten / Testen :)Ich habe auch einige Dinge mit den asynchronen Methoden in Python ausprobiert, aber ich hatte viel mehr Glück mit Twisted für die asynchrone Programmierung. Es hat weniger Probleme und ist gut dokumentiert. Hier ist ein Link von etwas ähnlichem zu dem, was Sie in verdreht versuchen.
http://pythonquirks.blogspot.com/2011/04/twisted-asynchronous-http-request.html
quelle