Skip to content

Instantly share code, notes, and snippets.

@CrazyLionHeart
Forked from nitely/token_bucket.py
Created March 31, 2014 17:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CrazyLionHeart/9897965 to your computer and use it in GitHub Desktop.
Save CrazyLionHeart/9897965 to your computer and use it in GitHub Desktop.
#! /usr/bin/python3
from time import time
from threading import Lock
class TokenBucket:
"""
An implementation of the token bucket algorithm.
"""
def __init__(self):
self.tokens = 0
self.rate = 0
self.last = time()
self.lock = Lock()
def set_rate(self, rate):
with self.lock:
self.rate = rate
self.tokens = self.rate
def consume(self, tokens):
with self.lock:
if not self.rate:
return 0
now = time()
lapse = now - self.last
self.last = now
self.tokens += lapse * self.rate
if self.tokens > self.rate:
self.tokens = self.rate
self.tokens -= tokens
if self.tokens >= 0:
return 0
else:
return -self.tokens / self.rate
if __name__ == '__main__':
import sys
from time import sleep
one_kb = 1024 * 1024
bucket = TokenBucket()
bucket.set_rate(one_kb)
for _ in range(10):
nap = bucket.consume(one_kb)
sleep(nap)
print(".")
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment