KeyboardInterrupt catch does not shut down the socketserver

Igor Katson descentspb at gmail.com
Sat May 16 02:40:26 EDT 2009


Gabriel Genellina wrote:
> 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 python.org>, 
>>> Igor Katson wrote:
>>>> Lawrence D'Oliveiro wrote:
>>>>> In message <mailman.183.1242371089.8015.python-list at python.org>, 
>>>>> 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 
>>> <http://docs.python.org/library/socket.html>.
>>>
>> 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)
> try:
>       server.serve_forever()
> except KeyboardInterrupt:
>       print "^C detected"
>       pass
> finally:
>       print "server_close()"
>       server.server_close()
> print "bye"
>
> (I've opened http://bugs.python.org/issue6031 )
>
> [1]
> http://docs.python.org/dev/library/socketserver.html?highlight=baseserver#SocketServer.BaseServer.shutdown 
>
>
Thanks, Gabriel, that's exactly what I was waiting for.



More information about the Python-list mailing list