Dynamiczne wątki

0

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ć.

Z góry dzięki
raker

0

Proszę o jakieś wskazówki. Oczywiście pojedyncze wątki potrafię obsługiwać.

Wskazówka: Zadaj pytanie.

To brzmi jakbyś nie umiał tablic obsługiwać a wątki tak.

0
raker napisał(a)

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

Delphi/Kompendium programisty/Aplikacje wielowątkowe napisał(a)

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;

0

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...

0
oho napisał(a)

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 :]

0

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ć.

0

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 :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1