asynchat producer ready() method patch.

Donovan Baarda abo@m...
Wed, 18 Apr 2001 11:38:48 +1000 (EST)


Quoting Ted Shab <tshab@y...>:

> Hello,
> 
> Saw this from the pipermail list. Has this patch been
> applied to the standard python distribution or is it
> pipermail specific? If the later, can you let me know
> where I might find the fix (I'm not really interested
> in pipermail).

Hmmm, someone is using this patch? Wow, (warm fuzzies :-). I'm Cc'ing this to 
the medusa list incase anyone else is interested.

AFAIK, no-one was using this patch apart from one person experimenting with it. 
There is nothing wrong with it, there just didn't seem to be much interest. I 
don't believe it has been applied anywhere apart from in my own projects. I'm 
hungry for any feedback on it and keen to support/promote it if there is 
interest.

The patch is against medusa-src-20000601.tar.gz, and can be found in;

ftp://minkirri.apana.org.au/pub/python/

Note that parts of medusa are distributed with python (asyncore.py and 
asynchat.py), and the relevant parts of the patch are designed to be compatible 
with the components in the python distribution (ie, there are no introduced 
dependancies and they are backwards compatible). I would like to think that the 
changes introduced also clean up the code a bit and provide a useful 
inheritance hirachy for producers. Performance heads might argue that the 
inheritance hurts performance. Comments about that are welcome too :-)

The only tips about this patch from experience are;

- be aware of how ready() is meant to work. It must return true whenever a 
producer is ready for more() to be called. That means when it has more data 
_or_ the producer is finished. Calling more() when a producer is not ready() is 
an error, and the producer base clases provided will raise an exception when 
this happens.

- beware of producers that already have ready() methods. The original medusa 
had quite a few vestigial ready() methods that behaved incorrectly. The patch 
includes changes to fix/remove these methods in medusa.

- a change in ready() status is not an event that will trigger select(). The 
ready() method is called before select() inside the main polling loop. This 
means a change in ready() status will not be immediately evaluated, but will be 
delayed until the next iteration through the loop. If no events trigger the 
select(), then this means it will be delayed untill the select() times out. The 
simple solution is to use a short timeout value. The complex solution is to 
make the change in ready() status trigger the select(), typicaly by putting an 
async object inside the producer. Note that this behaviour also affects the 
normal readable() and writeable() methods, but typicaly these change status as 
a result of something that triggers select() so you don't notice.

--
ABO: finger abo@m... for more information.