2011-07-01 7 views
5

Próbuję utworzyć skrypt w języku Python, który wykonuje kwerendy do wielu witryn. Skrypt działa dobrze (korzystam z urllib2), ale tylko z jednego linku. W przypadku witryn wielokrotnych wysyłam wiele żądań jeden po drugim, ale nie jest to zbyt potężne.Python: uruchom równolegle wiele zapytań i uzyskaj pierwsze ukończone.

Jakie jest idealne rozwiązanie (wątki, jak sądzę) do równoległego uruchamiania wielu zapytań i zatrzymywania innych, gdy zapytanie zwraca konkretny ciąg znaków?

Znalazłem to pytanie, ale nie znalazłem jak zmienić go zatrzymać pozostałe wątki ...: Python urllib2.urlopen() is slow, need a better way to read several urls

Z góry dziękuję!

(przepraszam jeśli zrobiłem błędy w języku angielskim, francuskim jestem ^^)

Odpowiedz

0

Zwykle jest to realizowane za pomocą następującego wzoru (przepraszam, moje umiejętności Python nie są tak dobre).

Masz klasę o nazwie Runner. Ta klasa ma długą metodę, która pobiera potrzebne informacje. Ma również metodę Anuluj, która w jakiś sposób przerywa długą metę (możesz uczynić obiekt żądania adresu URL polem należącym do klasy, więc klasa anulowania wywoła odpowiednik request.terminate()).

Metoda długo działająca musi akceptować funkcję zwrotną, która sygnalizuje zakończenie.

Następnie, zanim zaczniesz tworzyć wiele wątków, tworzysz instancje wszystkich obiektów tej klasy i umieszczasz je na liście. W tej samej pętli możesz uruchomić te długo działające metody, przekazując metodę zwrotną swojego głównego programu.

W metodzie wywołania zwrotnego wystarczy przejść przez listę wszystkich klas wątków i wywołać metodę anulowania.

Proszę edytować moją odpowiedź z każdej konkretnej implementacji Pythona :)

0

można uruchamiać zapytania z biblioteki multiprocessing, ankiety dla wyników i wyłączanie zapytań nie jest już potrzebna. Documentation dla modułu zawiera informacje o klasie Process, która ma metodę terminate(). Jeśli chcesz ograniczyć liczbę wysłanych żądań, sprawdź opcje łączenia.

2

Możesz użyć Twisted, aby współdziałać z wieloma żądaniami jednocześnie. Wewnętrznie wykorzysta epoll (lub iocp lub kqueue w zależności od platformy), aby uzyskać efektywne powiadomienie o dostępności tcp, co jest tańsze niż korzystanie z wątków. Gdy jedna prośba się zgadza, jesteś inny.

Here is the Twisted http agent tutorial.