Wypróbowałem próbkę dostarczoną w dokumentacji biblioteki żądań dla Pythona.
W przypadku async.map(rs)
otrzymuję kody odpowiedzi, ale chcę uzyskać zawartość każdej żądanej strony. To na przykład nie działa:
out = async.map(rs)
print out[0].content
Wypróbowałem próbkę dostarczoną w dokumentacji biblioteki żądań dla Pythona.
W przypadku async.map(rs)
otrzymuję kody odpowiedzi, ale chcę uzyskać zawartość każdej żądanej strony. To na przykład nie działa:
out = async.map(rs)
print out[0].content
requests-threads
istnieje teraz.Odpowiedzi:
Uwaga
Poniższa odpowiedź nie dotyczy żądań w wersji 0.13.0 +. Funkcjonalność asynchroniczna została przeniesiona do grequestów po napisaniu tego pytania. Jednakże, można po prostu zastąpić
requests
zgrequests
dołu i powinno działać.Pozostawiłem tę odpowiedź tak, jak ma odzwierciedlać pierwotne pytanie, które dotyczyło korzystania z żądań <v0.13.0.
Aby wykonać wiele zadań
async.map
asynchronicznie , musisz:async.map
listę wszystkich żądań / działańPrzykład:
źródło
from grequests import async
nie działa ... i ta definicja czegoś mi pasujedef do_something(response, **kwargs):
, znajduję ją ze stackoverflow.com/questions/15594015/ ...from requests import async
naimport grequests as async
pracowała dla mnie.async
Teraz jest niezależnym modułem:grequests
.Zobacz tutaj: https://github.com/kennethreitz/grequests
I tam: Idealna metoda wysyłania wielu żądań HTTP przez Python?
instalacja:
stosowanie:
zbuduj stos:
wyślij stos
wynik wygląda jak
Wydaje się, że grequests nie ustawia ograniczenia dla jednoczesnych żądań, tj. gdy wiele żądań jest wysyłanych do tego samego serwera.
źródło
results = grequests.map(rs)
kodowi po tym, jak ta linia jest zablokowana, widzę efekt asynchroniczny?Przetestowałem zarówno prośby - przyszłość, jak i życzenia . Grequests jest szybszy, ale przynosi małpie łatanie i dodatkowe problemy z zależnościami. request-futures jest kilkakrotnie wolniejsze niż grequests. Postanowiłem napisać własne i po prostu opakować żądania w ThreadPoolExecutor i było to prawie tak szybkie jak grequests, ale bez zewnętrznych zależności.
źródło
może prośby o przyszłość to inny wybór.
Zaleca się również w dokumencie biurowym . Jeśli nie chcesz angażować się w gevent, to dobrze.
źródło
ThreadPoolExecutor(max_workers=10)
Mam wiele problemów z większością opublikowanych odpowiedzi - albo korzystają z przestarzałych bibliotek, które zostały przeniesione z ograniczonymi funkcjami, albo zapewniają rozwiązanie ze zbyt dużą magią podczas wykonywania żądania, co utrudnia obsługę błędów. Jeśli nie należą do żadnej z powyższych kategorii, są bibliotekami innych firm lub są przestarzałe.
Niektóre z rozwiązań działają prawidłowo wyłącznie w przypadku żądań http, ale rozwiązania nie są odpowiednie dla innych rodzajów żądań, co jest śmieszne. W tym przypadku nie jest konieczne wysoce spersonalizowane rozwiązanie.
Samo użycie wbudowanej biblioteki Pythona
asyncio
jest wystarczające do wykonywania asynchronicznych żądań dowolnego typu, a także zapewnia wystarczającą płynność do obsługi złożonych i specyficznych dla użytkownika błędów.Jak to działa, jest proste. Tworzysz serię zadań, które chcesz wykonywać asynchronicznie, a następnie żądasz pętli, aby wykonać te zadania i zakończyć po zakończeniu. Brak dodatkowych bibliotek podlegających brakowi konserwacji, brak wymaganych funkcji.
źródło
async
. Wtedy możesz na przykład zrobićawait response = requests.get(URL)
. Nie?requests
jest ledwo szybsze (aw niektórych przypadkach wolniejsze) niż tylko synchroniczne wywoływanie listy adresów URL. Na przykład żądanie punktu końcowego, którego odpowiedź zajmuje 3 sekundy, przy użyciu powyższej strategii, zajmuje około 30 sekund. Jeśli chcesz prawdziwejasync
wydajności, musisz użyć czegoś takiegoaiohttp
.Wiem, że to było od jakiegoś czasu zamknięte, ale pomyślałem, że może być przydatne wypromowanie innego rozwiązania asynchronicznego opartego na bibliotece żądań.
Dokumenty są tutaj: http://pythonhosted.org/simple-requests/
źródło
źródło
Jeśli chcesz używać asyncio,
requests-async
zapewnia funkcjonalność async / await dlarequests
- https://github.com/encode/requests-asyncźródło
Od jakiegoś czasu używam żądań Pythona do wywołań asynchronicznych przeciwko gist API github.
Na przykład zobacz kod tutaj:
https://github.com/davidthewatson/flasgist/blob/master/views.py#L60-72
Ten styl Pythona może nie jest najlepszym przykładem, ale zapewniam, że kod działa. Daj mi znać, jeśli jest to dla Ciebie mylące, a udokumentuję to.
źródło
Możesz użyć
httpx
do tego.jeśli potrzebujesz funkcjonalnej składni, biblioteka gamla otacza to
get_async
.Wtedy możesz to zrobić
Plik
10
limit czasu w sekundach.(zastrzeżenie: jestem jego autorem)
źródło
respx
za kpiny / testy :)Próbowałem też kilku rzeczy przy użyciu metod asynchronicznych w Pythonie, ale miałem dużo więcej szczęścia, używając twisted do programowania asynchronicznego. Ma mniej problemów i jest dobrze udokumentowany. Oto link do czegoś podobnego do tego, co próbujesz w przekręconej.
http://pythonquirks.blogspot.com/2011/04/twisted-asynchronous-http-request.html
źródło