Wie würden Sie die Anzahl der Operationen pro Sekunde begrenzen?

7

Wie würden Sie die Anzahl der Operationen pro Sekunde begrenzen?

Nehmen wir an, wir müssen Dateien von einem Ort zum anderen kopieren, und wir wollen nicht mehr als 5 Dateien pro Sekunde verarbeiten.

Bitte sehen Sie, was ich mache

%Vor%

Aber ich brauche einen eleganteren und kugelsichereren Weg.

    
Sumee 03.11.2010, 07:51
quelle

5 Antworten

6

Ermitteln Sie die Startzeit, und berechnen Sie dann in der Schleife die maximale Anzahl der Dateien, die bis zur aktuellen Uhrzeit verarbeitet werden sollen, und aktivieren Sie den Ruhezustand, wenn Sie voraus sind:

%Vor%

Auf diese Weise wird der Code aufholen, wenn einige Operationen länger dauern. Wenn Sie nur eine Sekunde eine Operation ausführen, können Sie die nächste Sekunde sieben.

Beachten Sie, dass ich UtcNow anstelle von Now verwende, um den unangenehmen Zeitsprung zu vermeiden, der zweimal im Jahr stattfindet.

Bearbeiten:

Eine weitere Alternative besteht darin, die Zeit zu messen, die eine Operation benötigt, und den Rest des Zeitfensters zu schlafen:

%Vor%     
Guffa 03.11.2010, 08:18
quelle
5

Ich würde eine einfache Methode erstellen, die fünf Dateien gleichzeitig verarbeitet und jede Sekunde mit einem Timer aufruft.

    
Brian Rasmussen 03.11.2010 07:54
quelle
4

Sumee

Sie könnten eine gedrosselte Producer / Consumer-Warteschlange verwenden. Es würde einen Hintergrund-Thread haben, der in einem Intervall läuft und Ihre Datei verarbeitet. Sie können die Dateinamen bei ihrem Eintreffen in die Warteschlange einreihen, und die deaktivierte Aktion zum Entfernen der Warteschlange (Aktion) würde aus der Warteschlange entfernt. Hier ist ein Beispiel, was ich meine:

%Vor%     
dashton 03.11.2010 11:36
quelle
3

Beachten Sie, dass während Sie versuchen, die Anzahl der verarbeiteten Elemente auf 500 pro Sekunde zu begrenzen, der obige Code immer noch eine enge Schleife ausführt und somit die CPU belastet, auch wenn Sie keine Datei verarbeiten.

Wenn Sie eine echte Drosselung wünschen, müssen Sie Ihre Logik so ändern, dass sie timer- oder ereignisgesteuert ist, oder verwenden Sie eine der Wait * -Methoden, um Ihren Prozess in den Leerlauf zu versetzen, während Sie auf die nächste Gelegenheit warten. p>     

Franci Penov 03.11.2010 08:02
quelle
3

Verwenden Sie einen Token-Bucket:

Ссылка

    
Martin Broadhurst 03.11.2010 08:17
quelle

Tags und Links