]> code.delx.au - pymsnt/blob - src/tlib/throttle.py
Partial rate-limiting. Need to try and throttle down receiving of data too.
[pymsnt] / src / tlib / throttle.py
1 from twisted.internet import task
2
3
4
5 class Throttler:
6 def __init__(self, consumer, speed):
7 self.consumer = consumer
8
9 self.buffer = ""
10 self.speed = speed # Bytes/second
11 self.canClose = False
12
13 self.loopTask = task.LoopingCall(self.loopFunc)
14 self.loopTask.start(1.0)
15
16 def write(self, data):
17 if not self.consumer:
18 raise ValueError, "I/O operation on closed 'file'"
19 self.buffer += data
20
21 def close(self):
22 self.canClose = True
23
24 def loopFunc(self):
25 if self.canClose and len(self.buffer) == 0:
26 self.consumer.close()
27 self.consumer = None
28 self.loopTask.stop()
29
30 else:
31 chunk, self.buffer = self.buffer[:self.speed], self.buffer[self.speed:]
32 self.consumer.write(chunk)
33
34
35