Stopping SocketServer on Python 2.5

Mark Tolonen metolone+gmane at gmail.com
Thu Mar 12 04:03:06 EDT 2009


"Falcolas" <garrickp at gmail.com> wrote in message 
news:1b6a95a4-5680-442e-8ad0-47aa9ea08344 at w1g2000prk.googlegroups.com...
>On Mar 11, 1:11 pm, David George <d... at 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





More information about the Python-list mailing list