[Twisted-Python] IPushProducer problem

Jean-Paul Calderone exarkun at divmod.com
Tue Jan 13 09:03:21 MST 2009


On Tue, 13 Jan 2009 16:34:29 +0100, Gabriel Rossetti <gabriel.rossetti at arimaz.com> wrote:
>Hello everyone,
>
>I implemented a push-produce a while back and I though it works, but it 
>didn't. When the msgs where spaced out, it worked, but if several msgs were 
>sent one after the other, then things go bad (the msgs get mixed up)...
>
>I found this thread : http://www.twistedmatrix.com/pipermail/twisted-python 
>/2007-March/014983.html
>
>and I think I ave the same problem, my code looks a bit like his :
>
>    def pauseProducing(self):
>        """
>        Pause the producer
>        """
>        self.__paused = True
>
>    def resumeProducing(self):
>        """
>        Resume the producer
>        """
>        self.__paused = False
>
>        while(not self.__paused and self.__startLimit < self.__total):
>            data = self.__buf[self.__startLimit:self.__endLimit]
>            self.transport.write(data)
>            self.__startLimit = self.__endLimit
>            self.__endLimit += self.__burstSize
>            if(not self.__stream):
>                break
>
>        if(not self.__paused or self.__startLimit >= self.__total):
>            self.stopProducing()
>
>    def stopProducing(self):
>        """
>        Stop the producer
>        """
>        self.__paused = False
>        self.__startLimit = 0
>        self.__buf = None
>        self.__total = None
>        self.__endLimit = self.__burstSize
>
>and when I send a msg I use this :
>
>def sendMessage(self, msg):
>        if domish.IElement.providedBy(msg):
>            msg = msg.toXml()
>              if isinstance(msg, unicode):
>            msg = msg.encode('utf-8')
>                      self.__buf = msg
>        self.__total = len(msg)
>        if(self.__stream):
>            self.resumeProducing()
>
>I think what happens is that the code is re-entered, just like Jean-Paul 
>suggested in the other thread. The thing is I didn't understand the 
>solution, could somebody please explain it to me or suggest something else?

It's extremely difficult to say without seeing a complete example and without
knowing exactly how the code is failing.  However, one thing I do see is that
it is not safe to call your `sendMessage` a second time before all of the
data from the first call has been written.  Since you are using `__buf´ to
record the message to send, if you try to send another message, the first
buffer will be clobbered.  Could this be the problem you're having?

Perhaps consider appending to `__buf´ instead of overwriting it.  There are
probably lots of other areas where this code could improve too, but not
corrupting the internal state of the producer is a good start. :)

Jean-Paul




More information about the Twisted-Python mailing list