On 2009-03-12 08:03:06 +0000, "Mark Tolonen" <metolone+gm...@gmail.com> said:
"Falcolas" <garri...@gmail.com> wrote in message
news:1b6a95a4-5680-442e-8ad0-47aa9ea08...@w1g2000prk.googlegroups.com...
On Mar 11, 1:11 pm, David George <d...@eatmyhat.co.uk> wrote:
Again, problem here is the issue of being unable to kill the server
while it's waiting on a request. In theory, i could force it to
continue by sending some sort of junk data with the method i use to
stop the server, but that seems a bit hacky, don't you think?
Dave,
I agree, it does.
I'm in a bit over my head at this point, but does setting
self.socket.settimeout(0.5) cause the call to get_request (and thus
self.socket.accept()) to timeout? If so, that may be your ticket,
since socket.error exceptions are already caught by the TCPServer
class.
Here's the relevant code from Python 2.6's SocketServer.py. It uses
select() to see if a request is waiting to be serviced so
handle_request won't block. If the poll interval expires the while
loop will check the __serving flag. Not ideal, but better than
requiring a client to connect before the flag is checked. The comment
lists another idea:
def serve_forever(self, poll_interval=0.5):
"""Handle one request at a time until shutdown.
Polls for shutdown every poll_interval seconds. Ignores
self.timeout. If you need to do periodic tasks, do them in
another thread.
"""
self.__serving = True
self.__is_shut_down.clear()
while self.__serving:
# XXX: Consider using another file descriptor or
# connecting to the socket to wake this up instead of
# polling. Polling reduces our responsiveness to a
# shutdown request and wastes cpu at all other times.
r, w, e = select.select([self], [], [], poll_interval)
if r:
self._handle_request_noblock()
self.__is_shut_down.set()
-Mark
Thanks to everybody for helping me with this matter, but eventually
i've had to settle for a simpler and probably far less elegant solution
due to time constraints.
It seems that SocketServer.py in 2.6 doesn't directly rely on anything
that's in Python 2.6, so i've simply copied the code across and i'm
using it in place of the version built into Python 2.5.
I will probably return to this at a later date and try for a more
elegant solution, but right now university deadlines are looming!
Thanks all,
Dave
--
http://mail.python.org/mailman/listinfo/python-list