[Twisted-Python] does setTcpNoDelay() not work?

Jean-Paul Calderone exarkun at divmod.com
Mon Aug 11 14:22:31 EDT 2008


On Mon, 11 Aug 2008 20:18:43 +0200, Gabriel Rossetti <gabriel.rossetti at arimaz.com> wrote:
>Jean-Paul Calderone wrote:
>>On Mon, 11 Aug 2008 19:13:56 +0200, Gabriel Rossetti 
>><gabriel.rossetti at arimaz.com> wrote:
>>>Gabriel Rossetti wrote:
>>>>Hello,
>>>>
>>>>I'm needing to send small packets to update a progress bar. My update 
>>>>msgs were all being sent in big packets, so I tried setting 
>>>>setTcpNoDelay() in connectionMade() but it doesn't change anything, is it 
>>>>broken?
>>>>
>>>>Thank you,
>>>>Gabriel
>>>I an using code that I wrote using threads.deferToThread(), I wondered if 
>>>it was blocking the reactor maybe, so I tried just using a plain 
>>>deferToThread() call. Here's the code (without all the protocol stuff, 
>>>it's executed when data come in.
>>>
>>>    def loop(self):
>>>        import time
>>>        m = utils.createMessage("toto", "hello")
>>>        while(True):
>>>            print "Sending %s" % m.toXml()
>>>            self.sendMessage(m)
>>>            print "Sent!"
>>>            time.sleep(2)
>>>
>>>
>>>threads.deferToThread(self.loop)
>>>
>>>the TCP no delay option is turned on like I said before, the weird thing 
>>>is that I have the same thing, all my msgs get sent in big blocks. Either 
>>>the TCP no delay doesn't work, or the reactor is getting tied up. I don' t 
>>>get it since I'm running the blocking code in a thread, the reactor should 
>>>have nothing to do.
>>
>>Since you didn't include the definition of `sendMessage´, it's hard to say
>>what's really going on here.  However, my guess is that you're calling the
>>transport.write method in a non-reactor thread, which is not allowed.
>>
>>If this isn't the case, including a full, minimal example in your next
>>message would be a good idea. :)
>>
>>Jean-Paul
>Yes, self.sendMessage() calls transport.write. So there's no way of sending 
>msgs from a non-reactor thread, even if it has a reference to the protocol?
>

There is a way.  The way is to use reactor.callFromThread to schedule a
function to be called in the reactor thread.

eg, reactor.callFromThread(self.sendMessage)

Jean-Paul




More information about the Twisted-Python mailing list