Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Witam wszystkich,
jestem w trakcie tworzenia prostej aplikacji do testowania serwerów proxy.
Aplikacja w tym momencie działa w ten sposób, że pobiera proxy z bazy MySQL, a następnie próbuje się połączyć z dowolną stroną poprzez to proxy. Jeśli działa to jest ok, jeśli nie to nie ;).
Chciałbym aby testowanie proxy odbywało się poprzez wątki jednak na początku nie jestem w stanie określić liczby wątków jaka jest potrzebna gdyż, raz w ciągu 10 minut potrzebuej przetestować 100 adresów proxy a innym razem 200 (oczywiście zakładam że ustawiam timeout przy połączeniu na 10s i mniej więcej wiem ile wątków będę potrzebował na początku).
Proszę o jakieś wskazówki. Oczywiście pojedyncze wątki potrafię obsługiwać.
Chciałbym aby testowanie proxy odbywało się poprzez wątki jednak na początku nie jestem w stanie określić liczby wątków jaka jest potrzebna gdyż, raz w ciągu 10 minut potrzebuej przetestować 100 adresów proxy a innym razem 200
Nie zaleca się uruchamiania w tym samym czasie dużej ilości wątków w ramach tego samego procesu. Zalecana ilość to 16 wątków w ramach jednego procesu.
Według mnie 100 czy 200 adresów proxy sprawdzisz w czasie 1 minuty, nie potrzebujesz aż 10;
Stwórz jeden wątek, jedną macierz przechowującą adresy proxy i w pętli sprawdzaj po kolei każdy z nich przy ustawionym TimeOut; Gdyby TimeOut = 1s (przy większym odstępie czasu raczej nie wróci) i zawsze pakiet ginął w cyberprzestrzeni, przy 200 takich adresach masz 200 * 1s = 200s = 3,3min; Jeśli masz bardzo duży ruch i pakiety potrafią wrócić z powrotem po ponad 10s, to nie robiłbym dla każdego adresu osobnego wątku tylko wysłał po kolei pakiety do wszystkich i odbierał w jednym czasie; Wątek będzie jeden, ale nie będziesz oczekiwał na odpowiedz serwera proxy, tylko wysyłał następny, a jak ten wcześniejszy wróci to zapiszesz odpowiednie informacje o nim;
Jak to w praktyce wygląda to Ci nie napiszę, bo nigdy takiego czegoś nie robiłem; Zastanów się w jaki sposób napisać wysyłanie i odpieranie pakietów sprawdzających w jedym czasie tak, byś nie musiał czekać na odpowiedź serwera, bo to tylko strata czasu;
Nie zaleca się uruchamiania w tym samym czasie dużej ilości wątków w ramach tego samego procesu. Zalecana ilość to 16 wątków w ramach jednego procesu.
16? No prosze a u mnie:
opera.exe - 41 wątki
skype.exe - 34 wątki
explorer.exe - 20 wątków
AvastUI.exe - 16 wątków
Skoro M$ robi ponad 16, to znaczy że można. Inna sprawa że połowa z tych wątków zapewne ma niski priorytet albo idluje itd.
Ale z drugiej strony to racja, że powinna być kolejka rzeczy do testowania z której pare(naście jeżeli dobry net) wątków pobiera kolejne rzeczy do sprawdzenia.
Tylko że ja nadal nie rozumiem jaki problem ma pytacz, bo ani pytania nie zadał ani nie sprecyzował co za magię widzi w robieniu paru wątków...
Skoro M$ robi ponad 16, to znaczy że można. Inna sprawa że połowa z tych wątków zapewne ma niski priorytet albo idluje itd.
No więc właśnie, inną sprawą są priorytety wątków; Mimo wszystko Opera ma 41, a nie 200 :-P
oho napisał(a)
Ale z drugiej strony to racja, że powinna być kolejka rzeczy do testowania z której pare(naście jeżeli dobry net) wątków pobiera kolejne rzeczy do sprawdzenia.
Według mnie takie coś nie ma sensu, bo zbyt wiele czasu się marnuje na czekanie na odpowiedź serwera; Trzeba to zrobić inaczej, gdzie bez czekania na odpowiedź wysyła się kolejny pakiet, a w razie jak przyjdzie poprzedni trzeba go obsłużyć; Jestem pewien, że postępując w ten sposób wątek będzie jeden, lub dwa (osobne do wysyłania i odbierania), a cała procedura testująca wykona się maksymalnie w minutę;
oho napisał(a)
Skoro M$ robi ponad 16, to znaczy że można.
Z tego cytatu wynika, że można, ale nie jest to zalecane :]
Dzięki za odpowiedzi.
Pytanie wydawało mi się że zadałem jasno czyli chodzi o tworzenie liczby wątków której na starcie programu nie da się do końca oszacować.
Takie rozwiązanie wydawało się dla mnie najlepsze ale oczywiście nie upieram się że tak musi być.
Możesz to zrobić na wiele sposobów, gdzie ilość wątków musi być określana dynamicznie; Jeśli masz praktyczne umiejętności do pworzenia wątków to nie powinieneś mieć żadnych problemów z nimi; Jasne jest, że nie ma potrzeby tworzenia nowej instancji wątku dla każdego adresy z osobna, bo tylko zamulisz aplikację; Będzie to pewnie działać szybciej, niż w pętli wysyłanie i czekanie na odpowiedź, ale ilość wątków będzie zbyt dyża, by spełniały dobrze swoje zadanie;
Ja polecam uruchomić dwa wątki: jeden do wysyłania pakietu, drugi do monitorowania odpowiedzi z serwera; W pierwszym w pętli wysyłasz pakiety do serwerów, w drugim oczekujesz na odpowiedzi i odpowiednio rozpoznajesz skąd przyszedł pakiet i ustawiasz np. jakąś flagę w macierzy. Po określonym czasie (TimeOut) sprawdzasz stan macierzy i wykrywasz adresy, od których pakiet nie wrócił;
Praktykę (czyli implementację) pozostawiam dla Ciebie :]