Dobrym podejściem do rozwiązania tego problemu jest najpierw napisanie kodu wymaganego do uzyskania jednego wyniku, a następnie włączenie kodu wątkowego w celu zrównoleglenia aplikacji.
W idealnym świecie oznaczałoby to po prostu jednoczesne uruchomienie 100 000 wątków, które wysyłają swoje wyniki do słownika lub listy do późniejszego przetworzenia, ale w praktyce masz ograniczoną liczbę równoległych żądań HTTP, które możesz wysłać w ten sposób. Lokalnie istnieją ograniczenia dotyczące liczby gniazd, które można jednocześnie otworzyć, liczby wątków wykonania, na które zezwoli interpreter języka Python. Zdalnie możesz mieć ograniczoną liczbę jednoczesnych połączeń, jeśli wszystkie żądania dotyczą jednego serwera lub wielu. Ograniczenia te prawdopodobnie będą wymagać napisania skryptu w taki sposób, aby w dowolnym momencie sondować tylko niewielką część adresów URL (100, jak wspomniano w innym plakacie, to prawdopodobnie przyzwoity rozmiar puli wątków, chociaż może się okazać, że może pomyślnie wdrożyć wiele innych).
Możesz wykonać ten wzór, aby rozwiązać powyższy problem:
- Rozpocznij wątek, który uruchamia nowe wątki żądań, aż liczba aktualnie działających wątków (możesz je śledzić za pomocą threading.active_count () lub poprzez pchanie obiektów wątku do struktury danych) wynosi> = maksymalna liczba jednoczesnych żądań (powiedzmy 100) , potem śpi przez krótki czas. Wątek powinien zakończyć się, gdy nie będzie już adresów URL do przetworzenia. W ten sposób wątek będzie się budził, uruchamiał nowe wątki i spał, dopóki nie skończysz.
- Niech wątki żądań przechowują swoje wyniki w jakiejś strukturze danych do późniejszego pobrania i wygenerowania. Jeśli struktura, w której zapisujesz wyniki, to a
list
lubdict
CPython, możesz bezpiecznie dołączyć lub wstawić unikalne elementy z wątków bez blokad , ale jeśli piszesz do pliku lub wymagasz bardziej złożonej interakcji między wątkami , powinieneś użyć blokada wzajemnego wykluczenia w celu ochrony tego stanu przed korupcją .
Sugerowałbym użycie modułu wątków . Możesz go użyć do uruchamiania i śledzenia uruchomionych wątków. Obsługa wątków w Pythonie jest pusta, ale opis problemu sugeruje, że jest całkowicie wystarczający dla twoich potrzeb.
Wreszcie, jeśli chcesz zobaczyć całkiem proste stosowanie równoległej aplikacji sieciowej napisany w Pythonie, sprawdź ssh.py . To mała biblioteka, która wykorzystuje wątki w języku Python do równoległego łączenia wielu połączeń SSH. Projekt jest na tyle zbliżony do twoich wymagań, że możesz uznać go za dobry zasób.