> class StoppableXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
> def serve_forever(self):
> """to stop this server: register a function in the class
> that uses it which sets server.stop to True."""
> self.stop = False
> while not self.stop:
> self.handle_request()
>
> Here's the code where I start the server...
>
> try:
> self.server.serve_forever()
> finally:
> self.server.server_close()
> self.log('server closed')
>
> >From another thread, I set the server's stop attribute to False, so the
> server stops running. It exits the try block, runs server_close(), then I
> get the message 'server closed'...
>
> ...but when I try to use the port that the server's bound to again, it
> takes a very long time (while i try to use the port, catch the
> exception, sleep, try again) until it becomes free. Is there something
> else I need to call to ensure that the port is released cleanly? Is this
> an OS-specific thing out of my control? (I'm running Debian Linux.)
Hi Lawrence,
It's TCP specific. When the server shuts down, the port is in a TIME_WAIT
state that causes the port to wait until things are cleanly shut down.
For more information on TIME_WAIT, see:
http://www.developerweb.net/sock-faq/detail.php?id=13
Anyway, you can force the issue, get the server to "reuse" the address, by
setting the "allow_reuse_address" attribute on your server.
##
class StoppableXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
"""Override of TIME_WAIT"""
allow_reuse_address = True
def serve_forever(self):
self.stop = False
while not self.stop:
self.handle_request()
##
See:
http://www.python.org/doc/lib/module-SocketServer.html
for a brief mention of allow_reuse_address.
One of these days, I have to read Richard Stevens's book on TCP to better
understand what exactly is going on. I have to admit that I don't
understand the TCP model quite well yet.
Best of wishes to you!
___
Tutor maillist - Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor