KeyboardInterrupt catch does not shut down the socketserver

Gabriel Genellina gagsl-py2 at
Sat May 16 02:01:41 CEST 2009

En Fri, 15 May 2009 09:04:05 -0300, Igor Katson escribió:
> Lawrence D'Oliveiro wrote:
>> In message <mailman.185.1242375959.8015.python-list at>, Igor  
>> Katson wrote:
>>> Lawrence D'Oliveiro wrote:
>>>> In message <mailman.183.1242371089.8015.python-list at>, Igor  
>>>> Katson wrote:
>>>>> I have problems in getting a SocketServer to shutdown.
>>>> Do you want to do a shutdown or a close?
>>> I want the server close the socket ...
>> You want to do a close, do a close, not a shutdown  
>> <>.
> Shutdown implies closing the listening socket, doesn't it?

No (perhaps it should, but that is another issue). There is a
documentation bug; BaseServer.shutdown is documented as "Tells the
serve_forever() loop to stop and waits until it does." [1]
The docstring is much more explicit: """Stops the serve_forever loop.
Blocks until the loop has finished. This must be called while
serve_forever() is running in another thread, or it will deadlock."""

So, if you have a single-threaded server, *don't* use shutdown(). And, to
orderly close the listening socket, use server_close() instead. Your code
would become:

    from SocketServer import TCPServer, BaseRequestHandler

server = TCPServer(('localhost',1234), BaseRequestHandler)
except KeyboardInterrupt:
       print "^C detected"
       print "server_close()"
print "bye"

(I've opened )


Gabriel Genellina

More information about the Python-list mailing list