TokenBucket(capacity, rate): vödör = capacity utolsó_frissítés = most() amíg van csomag: most = jelenlegi idő eltelt_idő = most - utolsó_frissítés új_vezérjelek = eltelt_idő * rate vödör = min(vödör + új_vezérjelek, capacity) ha csomag_súlya <= vödör: vödör = vödör - csomag_súlya engedélyezd a csomagot különben: várakozz utolsó_frissítés = most
import time
class TokenBucket:
def __init__(self, capacity, rate):
self.capacity = capacity # A vödör maximális kapacitása
self.rate = rate # A vezérjelek érkezési sebessége (token/s)
self.tokens = capacity # Kezdetben tele a vödör
self.last_refill_time = time.time()
def allow_request(self, tokens_needed=1):
# Frissítjük a vödörben lévő vezérjelek számát
current_time = time.time()
elapsed = current_time - self.last_refill_time
self.tokens = min(self.capacity, self.tokens + elapsed * self.rate)
self.last_refill_time = current_time
# Ellenőrizzük, hogy van-e elég vezérjel a kérés teljesítéséhez
if self.tokens >= tokens_needed:
self.tokens -= tokens_needed
return True
else:
return False
# Példa használat
bucket = TokenBucket(capacity=10, rate=5) # 10-es kapacitású vödör, 5 vezérjel/másodperc
requests =
for req in requests:
if bucket.allow_request(req):
print(f"{req} vezérjel kérése engedélyezve.")
else:
print(f"{req} vezérjel kérése megtagadva.")
time.sleep(0.5) # Várunk, hogy vezérjelek érkezzenek
Kimenet (időzítéstől függően):
1 vezérjel kérése engedélyezve. 2 vezérjel kérése engedélyezve. 3 vezérjel kérése engedélyezve. 4 vezérjel kérése megtagadva. 5 vezérjel kérése megtagadva.
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace chrono;
class TokenBucket {
private:
double capacity;
double rate;
double tokens;
steady_clock::time_point last_refill_time;
public:
TokenBucket(double cap, double r) : capacity(cap), rate(r), tokens(cap), last_refill_time(steady_clock::now()) {}
bool allow_request(double tokens_needed = 1) {
auto now = steady_clock::now();
double elapsed = duration_cast<milliseconds>(now - last_refill_time).count() / 1000.0;
tokens = min(capacity, tokens + elapsed * rate);
last_refill_time = now;
if (tokens >= tokens_needed) {
tokens -= tokens_needed;
return true;
} else {
return false;
}
}
};
int main() {
TokenBucket bucket(10, 5); // 10-es kapacitás, 5 vezérjel/másodperc
double requests = {1, 2, 3, 4, 5};
for (double req : requests) {
if (bucket.allow_request(req)) {
cout << req << " vezérjel kérése engedélyezve." << endl;
} else {
cout << req << " vezérjel kérése megtagadva." << endl;
}
this_thread::sleep_for(milliseconds(500)); // Várunk, hogy vezérjelek érkezzenek
}
return 0;
}
Kimenet (időzítéstől függően):
1 vezérjel kérése engedélyezve. 2 vezérjel kérése engedélyezve. 3 vezérjel kérése engedélyezve. 4 vezérjel kérése megtagadva. 5 vezérjel kérése megtagadva.
A vezérjeles vödör algoritmus egy hatékony és rugalmas módszer a hálózati forgalom szabályozására. Pythonban és C++-ban is könnyen implementálható, és különféle rendszerekben, például API-k sebességkorlátozásában vagy hálózati forgalomszabályozásban alkalmazható.