[Twisted-Python] CONNECTION_LOST not an integer (docstring error?)

Michael McNeil Forbes mforbes at physics.ubc.ca
Wed Oct 1 16:37:47 MDT 2008


> On Oct 1, 2008, at 3:44 PM, Jean-Paul Calderone wrote:
...
>> Why does writeSomeData not simply raise CONNECTION_LOST as an   
>> exception? Checking return values is quite un-pythonic.  Is there  
>> a  deep reason for this?
>
> The reason is probably that whoever wrote it thought that raising an
> exception would be enough slower than returning a special value that
> it would be worth doing something slightly unusual.  Compared to
> returning a value, raising an exception is expensive in CPython, but
> I doubt there is any surviving benchmark which demonstrates that it
> makes a difference here.
>
> However, it's a very low-level API and since it isn't intended to be
> used by application code, it doesn't seem like a very high priority
> to make it less confusing.

By the way, is there any convention by which "high level" API  
routines are distinguished from "low level" routines?  It is really  
not that clear from the docs... (writeSomeData comes first in the  
listing etc.)

>> P.S. I came across this because I was trying to use twisted  
>> running  in a thread to write data resulting from a long  
>> computation that I  have not yet turned into a producer.  The more  
>> conventional "write"  method was failing if the socket backed up,  
>> and provided no simple  way of determining if data was being  
>> dropped.  My solution was to  used writeSomeData, and then have  
>> the computation decide to throw out  some of the data if it is  
>> being produced too rapidly, but I need to  know how much has been  
>> sent so I can decide what to throw away...
>>
>
> This seems more interesting than the main point of your email. :) You
> should probably just do the work to turn the computation into a  
> producer.
> This because:
>
>  * writeSomeData is low level and crufty, as you've discovered
>  * Not all reactors have this API, so your program will break based on
>    the reactor selected to run it
>  * producers give you all the same information
>
> Since you mentioned threads, I'll also point out that Twisted APIs  
> are not
> safe to use from non-reactor threads without  
> reactor.callFromThread.  If
> you aren't using callFromThread, that would explain bad behavior  
> from the
> write method.

I know that and am using callFromThread: The reason I am having bad  
behavior is because the socket is backing up.  Once I put in the  
logic to throw out data, it works fine... but the lack of reactor  
support concerns me somewhat.  I don't want the computation to stop,  
but think I could put an intermediate "push producer" that stops by  
discarding the data.

I am threading because the computation is the main task, and the  
network stuff is simply a window into the state of the computation.   
I want the computation to run continually, and it needs to do so in a  
blocking sort of way, periodically checking and pushing the partial  
results (like once every 30 minutes or so).

I want the calculation code to function on its own, with or without  
the twisted components and I don't see a simple way of doing this if  
twisted is in complete control without some type of threading.

My current design is to write my calculation as if twisted did not  
exist, and just push the current results onto a Queue periodically.   
Then I run twisted in a separate thread with clients that  
periodically check the queue, pop stuff off and dispatch it to any  
clients who happen to connect and want the data.

Is there a simpler way to do this all with twisted without using  
threads?  (The main goal is having an extremely minimal set of hooks  
for the people writing the computational code, and having the  
computational code run as fast as possible.)

Thanks for all of the suggestions and prompt comments!  (And for one  
very "twisted" library;-)
Michael.




More information about the Twisted-Python mailing list