+from twisted.internet import task
+
+
+
+class Throttler:
+ def __init__(self, consumer, speed):
+ self.consumer = consumer
+
+ self.buffer = ""
+ self.speed = speed # Bytes/second
+ self.canClose = False
+
+ self.loopTask = task.LoopingCall(self.loopFunc)
+ self.loopTask.start(1.0)
+
+ def write(self, data):
+ if not self.consumer:
+ raise ValueError, "I/O operation on closed 'file'"
+ self.buffer += data
+
+ def close(self):
+ self.canClose = True
+
+ def loopFunc(self):
+ if self.canClose and len(self.buffer) == 0:
+ self.consumer.close()
+ self.consumer = None
+ self.loopTask.stop()
+
+ else:
+ chunk, self.buffer = self.buffer[:self.speed], self.buffer[self.speed:]
+ self.consumer.write(chunk)
+
+
+