[Twisted-Python] Twisted Words: throttling server output

Jean-Paul Calderone exarkun at divmod.com
Sat Dec 3 14:40:00 EST 2005


On Sat, 3 Dec 2005 10:38:14 -0800, Seventh Holy Scripture <7hs at muchan.org> wrote:
>I've been writing an IRC bot using Twisted Words, and am having  difficulty 
>keeping it from flooding itself off the server. Currently  my output 
>subroutines look like this:
>
>     def queueMsg(self, channel, msg):
>         self.chanQueue.append(channel)
>         self.msgQueue.append(msg)
>
>     def emptyMsgQueue(self):
>         for msg in self.msgQueue:
>             channel = self.chanQueue.pop(0)
>             self.msg(channel, msg)
>             if channel[0] == "#":
>                 self.logger.log("<%s> %s" % (self.nickname, msg))
>             time.sleep(0.5)
>         self.msgQueue = []

The time.sleep() call blocks the entire reactor thread.  Eventually, 
the loop exits, the reactor regains control of program flow, notices 
a huge pile of messages in the IRC connection's output buffer, and 
sends them all as fast as it can.  Woops. :)

Take a look at reactor.callLater() or twisted.internet.task.LoopingCall().
These will let you schedule events to happen at particular times without 
blocking the reactor, and thus allowing each message to be sent at a 
reasonable time.

Jean-Paul




More information about the Twisted-Python mailing list