Ben Parker wrote on 01/18/2006 12:45 PM:
>>> Unfortunately, the 3rd party is unstable, and when they have a problem,
>>> sometimes the appserver crashes with this error:
>>> Traceback (most recent call last):
>>> File "WebKit/ThreadedAppServer.py", line 630, in run
>>> File "WebKit/ThreadedAppServer.py", line 156, in mainloop
>>> File "/usr/local/lib/python2.4/socket.py", line 169, in accept
>>> error: (24, 'Too many open files')
>> If you're keeping the old data then you can simply wrap your 3rd party
>> call into a try -except statement and use the old data if your update
> I have that already. I think the problem is that the sockets are not
> timing out or throwing any error, so the except block never triggers.
I'm going to partially answer my own question here:
Doh! There is no timeout in the Python 2.4 socket module by default. For
some reason I had thought it was 2 mins. I am now calling
socket.setdefaulttimeout in the __init__ of my context to set a default
timeout of 2.5 mins, which causes these connections to time out instead
of consuming all available files.
However, I need to control the timeout value on a per-socket basis. I
don't want to use socket.setdefaulttimeout because of the variety of
requests this application needs to make. There are some that can
tolerate relatively short timeouts (20 secs or so), but there are
critical transactions which could take a couple minutes to return from
the remote server.
A quick check of the socket module reveals that since Python 2.3 one can
set a timeout on a particular socket object. So now I need to find a way
of doing that through urllib2 or httplib or work around it by rolling my
own httplib. I'll post some more info if I get anything going.
In the meantime, if anyone has an application which is setting
per-socket timeouts for https transactions I would be very interested to
hear how you are doing it. :)