]> code.delx.au - pymsnt/blob - src/throttle.py
Recursively ignore *.pyc
[pymsnt] / src / throttle.py
1 # Copyright 2006 James Bunton <james@delx.cjb.net>
2 # Licensed for distribution under the GPL version 2, check COPYING for details
3
4
5 from twisted.internet import task
6
7 class Throttler:
8 def __init__(self, consumer, speed):
9 self.consumer = consumer
10
11 self.buffer = ""
12 self.speed = speed # Bytes/second
13 self.canClose = False
14
15 self.loopTask = task.LoopingCall(self.loopFunc)
16 self.loopTask.start(1.0)
17
18 def write(self, data):
19 if not self.consumer:
20 raise ValueError, "I/O operation on closed 'file'"
21 self.buffer += data
22
23 def close(self):
24 self.canClose = True
25
26 def error(self):
27 self.consumer.error()
28 self.consumer = None
29 self.buffer = None
30 self.loopTask.stop()
31
32 def loopFunc(self):
33 if self.canClose and len(self.buffer) == 0:
34 self.consumer.close()
35 self.consumer = None
36 self.loopTask.stop()
37
38 else:
39 chunk, self.buffer = self.buffer[:self.speed], self.buffer[self.speed:]
40 self.consumer.write(chunk)
41
42
43