from SocketServer import UnixStreamServer, BaseRequestHandler
server = UnixStreamServer('/tmp/ss.sock', BaseRequestHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
server.shutdown()
After that the server does not respond any more, but the application hangs.
What's the proper way to shutdown the socketserver and what is my mistake?
> I have problems in getting a SocketServer to shutdown.
Do you want to do a shutdown or a close?
> Lawrence D'Oliveiro wrote:
>
>> In message <mailman.183.1242371...@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>.
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 )
--
Gabriel Genellina
from SocketServer import TCPServer, BaseRequestHandler
from threading import Thread
server = TCPServer(('localhost',1234), BaseRequestHandler)
try:
run_thread = Thread(target=server.serve_forever)
run_thread.start()
run_thread.join()
except KeyboardInterrupt:
print "^C detected"
pass
finally:
print "server_shutdown()"
kill_thread = Thread(target=server.shutdown)
kill_thread.start()
print "bye"
> Hmm. Gabriel, could you please show the same for the threaded version?
> This one deadlocks:
> [code removed]
The shutdown method should *only* be called while serve_forever is
running. If called after server_forever exited, shutdown() blocks forever.
<code>
from SocketServer import TCPServer, BaseRequestHandler
from threading import Thread
server = TCPServer(('localhost',1234), BaseRequestHandler)
run_thread = Thread(target=server.serve_forever)
run_thread.start()
try:
print "press ^C to exit"
import time; time.sleep(30)
except KeyboardInterrupt:
print "^C detected"
pass
server.shutdown()
run_thread.join()
print "bye"
</code>
But, what are you after, exactly? I think I'd use the above code only in a
GUI application with a background server.
There are other alternatives, like asyncore or Twisted.
--
Gabriel Genellina