| 21 | from threading import Lock |
| 22 | |
| 23 | class Bucket: |
| 24 | def __init__(self): |
| 25 | self.rate = 0 |
| 26 | self.tokens = 0 |
| 27 | self.timestamp = time() |
| 28 | self.lock = Lock() |
| 29 | |
| 30 | def __nonzero__(self): |
| 31 | return False if self.rate < 10240 else True |
| 32 | |
| 33 | def setRate(self, rate): |
| 34 | self.lock.acquire() |
| 35 | self.rate = int(rate) |
| 36 | self.lock.release() |
| 37 | |
| 38 | def consumed(self, amount): |
| 39 | """ return time the process have to sleep, after consumed specified amount """ |
| 40 | if self.rate < 10240: return 0 #min. 10kb, may become unresponsive otherwise |
| 41 | self.lock.acquire() |
| 42 | |
| 43 | self.calc_tokens() |
| 44 | self.tokens -= amount |
| 45 | |
| 46 | if self.tokens < 0: |
| 47 | time = -self.tokens/float(self.rate) |
| 48 | else: |
| 49 | time = 0 |
| 50 | |
| 51 | |
| 52 | self.lock.release() |
| 53 | return time |
| 54 | |
| 55 | def calc_tokens(self): |
| 56 | if self.tokens < self.rate: |
| 57 | now = time() |
| 58 | delta = self.rate * (now - self.timestamp) |
| 59 | self.tokens = min(self.rate, self.tokens + delta) |
| 60 | self.timestamp = now |
| 61 |
no outgoing calls
no test coverage detected