[Python-Dev] Minor socket timeout quibble - timeout raises socket.error

Bernard Yue bernie@3captus.com
Fri, 12 Jul 2002 14:56:11 -0600


Guido van Rossum wrote:

> > To distinguish a timeout error, the caller can check s->sock_timeout
> > when a non-blocking mode error occured, or just return an error code
> > from internal_select() (I guess you must have your reason to taken it
> > out in the first place)
> 
> I don't understand your first suggestion.  Not all errors mean that
> the timeout triggered!
> 

For example, when accept() fail with error code EAGAIN and
s->sock_timeout = 5.0, it indicates timeout.  Same for connect() fail
with EINPROGRESS.  Anyway, on second thought, it is messy.

> >
> > How about the following (assume we have socket.setDefaultTimeout()):
> >
> >     import socket
> >     import urllib
> >
> >     socket.setDefaultTimeout(5.0)
> >     retry = 0
> >     url = 'some url'
> >
> >     while retry < 3:
> >         try:
> >             file = urllib.urlretrieve(url)
> >         except socket.TimeoutError:
> >             if retry == 2:
> >                 print "Server too busy, given up!"
> >                 raise
> >             else:
> >                 print "Server busy, retry!"
> >                 retry += 1
> >         else:
> >             break
> >
> > MS IIS behave strangely to http request.  When the server is very busy,
> > it will randomly drop some requests without disconnecting the client.
> > So the best approach for the client is to timeout and retry.  I guess
> > that might be the reason why people needed timeoutsocket in the first
> > place.
> 
> One of the reasons (there are lots of reasons why a connect or receive
> attempt may be very slow to time out, or even never time out).
> 
> Of course, this stll doesn't distinguish between a timeout from
> connect() and one from recv().
> 

I think you are right on the point.  Client might not care if the call
is timeouted on connect() or recv().  In this case a timeout error comes
handy.

> Have you ever written code like this?
> 

Yes I did.  

> > I am struggling with the test case for the new socket code.  The timeout
> > test case I've send you works with the old socketmodule.c (attached),
> > but not with the lastest version (on linux or windows).  It's strange,
> > your new implementation looks much cleaner.
> 
> No need to attach copies of old versions -- just give me the CVS
> revision number. :-)
> 

socketmodule.c  version 1.225
socketmodule.h  version 1.7

> > Please bear with me a bit longer for a patch  :.(
> 
> OK.
> 
> Anyway, I have no time to play with this right now, so I'm glad you
> aren't giving up just yet. :-)
> 

It is very painful indeed (Tim was so right).

> --Guido van Rossum (home page: http://www.python.org/~guido/)

Bernie