Laden...

Funktion von Threads nur x in der Minute aufrufen

Erstellt von asdfasdfasdf vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.231 Views
A
asdfasdfasdf Themenstarter:in
1 Beiträge seit 2014
vor 9 Jahren
Funktion von Threads nur x in der Minute aufrufen

hallo

ich habe ein problem, und zwar arbeite ich mithilfe einer web api (BingSearchAPI) mit dieser ich suchergebnisse erstelle... Mein Problem ist, dass ich z.b. 2k Threads am laufen habe und einige davon vll 400 auf eine fuktion zugreifen die diese API ausführt, was dann z.b. zu 200 anfragen in 10 sek führt und das ist zu viel, werde dann immer banned für eine gewisse zeit.

Ich suche nun eine Lösung mit dieser ich aus mehrern hundert Threads auf eine fuktion zugreifen kann wurde die funktion jedoch schon x mal in der Minute verwendet, dann soll gewartet werden... bis die fuktion wieder ausgeführt werden kann...

aktuell habe ich es mit max 3 gleichzeitigen abfragen limitiert


while (Programm.Globals.curDomainRequest >= Programm.Globals.maxDomainRequest)
                System.Threading.Thread.Sleep(Globals.randomInt(200, 1000));

Programm.Globals.curDomainRequest++;

Codearbeit....

Programm.Globals.curDomainRequest--;

allerdings ist diese funktion viel zu langsam... und es werden trotzdem mehrer threads gleichzeitig erstellt wie erlaubt

T
2.224 Beiträge seit 2008
vor 9 Jahren

Da müsstest du einen Counter zusammen mit dem Keyword "lock" verwenden.
Ist aber nur der Anfang.
Du müsstest dir eigentlich eine eigene Methode basteln die prüft wie oft in der aktuellen Minute bereits auf diese Methode zugegriffen wurde und dann je nach Zugriffszahl die Verarbeitung durchführen oder abbrechen.

Bei 2K Threads wird das aber eine sehr unschöne Verarbeitung.
Auch sind deine Threads mit dem zufälligen Sleep nicht besonders brauchbar.
Es kann ja sein, dass deine Threads im schlimmsten Fall ewig auf eine Durchführen in deiner Sleep Schleife warten müssen.

Kannst du deine Anzahl nicht runter drehen?
Oder brauchst du wirklich 2K Threads?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo asdfasdfasdf,

wenn deine API-Aufrufe immer zu frequent eingehen, wenn also die API-Aufrufe immer das Nadelöhr darstellen, dann brauchst du dir nur einen Wrapper für den API-Aufruf zu schreiben, der der vor dem eigentlichen Aufruf pauschal ein Thread.Sleep ausführt. Die Schlafzeit ergibt sich aus Zeitspanne in Millisekunden geteilt durch erlaubte Aufrufe pro Zeitspanne. Wenn also in 10 Sekunde gleich 10000 Millisekunden 50 Aufrufe erlaubt sind, wäre die Schlafzeit 200ms.

Wenn die API-Aufrufe nur manchmal das Nadelöhr bilden, wird es komplizierter, weil man dann wie T-Virus geschrieben hat, mitrechnen muss, wieviele Aufrufe in der jeweils zurückliegenden Zeitspanne bereits durchgeführt werden und nur (bis zum Ende der Zeitspanne) warten muss, wenn die Maximalanzahl schon erreicht ist.

Richtig ist, dass für das Mitrechnen eine Sperre per lock erforderlich ist bzw. aus andere geeignete Weise synchronisiert werden muss.

herbivore