2012-05-11 25 views
7

Powiel możliwe:
Multiple (asynchronous) connections with urllib2 or other http library?Idealna metoda wysyłania wielu żądań HTTP w Pythonie?

Pracuję na serwerze WWW Linux, który biegnie kodu Pythona chwycić w czasie rzeczywistym danych przez HTTP z 3rd party API. Dane są umieszczane w bazie danych MySQL. Potrzebuję dużo zapytań do wielu adresów URL i muszę to zrobić szybko (szybciej = lepiej). Obecnie używam urllib3 jako mojej biblioteki HTTP. Jaki jest najlepszy sposób na rozwiązanie tego problemu? Czy powinienem odradzać się wiele wątków (jeśli tak, ile?) I mieć każde zapytanie o inny adres URL? Chciałbym usłyszeć twoje przemyślenia na ten temat - dzięki!

Odpowiedz

23

Jeśli dużo jest naprawdę dużo niż prawdopodobnie chcesz użyć asynchronicznego I nie wątków.

requests + gevent = grequests

GRequests pozwala na użycie zapytania z Gevent łatwo zrobić asynchronicznych żądań HTTP.

import grequests 

urls = [ 
    'http://www.heroku.com', 
    'http://tablib.org', 
    'http://httpbin.org', 
    'http://python-requests.org', 
    'http://kennethreitz.com' 
] 

rs = (grequests.get(u) for u in urls) 
grequests.map(rs) 
+1

Chcę użyć tej metody do wysyłania żądań do około 50 000 adresów URL. Czy to dobra strategia? A co z wyjątkami typu timeout itp? – John

+0

@John Tak, jest. Odnośnie do wyjątków, zobacz parametr ['safe_mode'] (http://requests.readthedocs.org/en/latest/api/) i wydanie [953] (https://github.com/kennethreitz/requests/pull/953) –

+5

Nie mogę wysłać więcej niż 30 żądań, używając najwyraźniej. Kiedy to zrobię, otrzymuję komunikat "Maksymalna liczba ponownych prób przekroczenia adresu URL: ..., Zbyt wiele otwartych plików". Czy mimo to można rozwiązać ten problem? – AliBZ

1

Powinieneś używać zarówno wielowątkowości, jak i żądań potokowania. Na przykład wyszukaj-> szczegóły-> zapisz

Liczba wątków, których możesz użyć, nie zależy tylko od Twojego sprzętu. Ile żądań może świadczyć usługa? Ile współbieżnych żądań pozwala na uruchomienie? Nawet twoja przepustowość może być wąskim gardłem.

Jeśli mówisz o rodzaju skrobania - usługa może zablokować Cię po przekroczeniu pewnej granicy żądań, więc musisz używać serwerów proxy lub wielu wiązań IP.

Jeśli chodzi o mnie, w większości przypadków mogę uruchamiać 50-300 jednoczesnych żądań na moim laptopie ze skryptów Pythona.

+0

Zgadzam się z Polką, tutaj. W większości przypadków, gdy wysyłasz żądania HTTP do dowolnej usługi, większość czasu (zegara) jest oczekiwana na odpowiedź sieci i usługi zdalnej. W związku z tym im więcej wątków, tym lepiej w danym momencie, większość wątków będzie po prostu czekać w kolejkach. Zdecydowanie skorzystaj z notatek Polschy na temat ograniczania usług. – parselmouth

+0

dzięki chłopaki - usługa jest komercyjna i płacimy za to. jest bardzo szybki i nie będzie wąskim gardłem. w takim przypadku jaka byłaby najlepsza opcja? – user1094786

+0

@ user1094786 W tym przypadku po prostu spróbuj zbudować potok żądań i eksperymentuj z wieloma wątkami na każdym etapie. Po prostu spróbuj, prędzej czy później znajdziesz górny limit :-) –

0

Brzmi jak doskonała aplikacja do Twisted. Oto niektóre web-related examples, w tym, jak download a web page. Oto powiązane pytanie na temat database connections with Twisted.

Zauważ, że Twisted robi nie polegać na wątkach do robienia wielu rzeczy naraz. Raczej wymaga to podejścia cooperative multitasking --- twój główny skrypt uruchamia reaktor, a reaktor wywołuje skonfigurowane funkcje. Twoje funkcje muszą przywrócić kontrolę do reaktora, zanim reaktor będzie mógł kontynuować pracę.

Powiązane problemy