\method{serve_forever()} method of the server object to process one or
many requests.
+When inheriting from \class{ThreadingMixIn} for threaded connection
+behavior, you should explicitly declare how you want your threads
+to behave on an abrupt shutdown. The \class{ThreadingMixIn} class
+defines an attribute \var{daemon_threads}, which indicates whether
+or not the server should wait for thread termination. You should
+set the flag explicitly if you would like threads to behave
+autonomously.
+
Server classes have the same external methods and attributes, no
matter what network protocol they use:
class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
The Mix-in class must come first, since it overrides a method defined
-in UDPServer!
+in UDPServer! Setting the various member variables also changes
+the behavior of the underlying server mechanism.
To implement a service, you must derive a class from
BaseRequestHandler and redefine its handle() method. You can then run
class ThreadingMixIn:
"""Mix-in class to handle each request in a new thread."""
+ # Decides how threads will act upon termination of the
+ # main process
+ daemon_threads = 0
+
def process_request_thread(self, request, client_address):
"""Same as in BaseServer but as a thread.
import threading
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
+ if self.daemon_threads:
+ t.setDaemon (1)
t.start()
Library
-------
+- When cancelling a server that implemented threading with a keyboard
+ interrupt, the server would shut down but not terminate (waiting on
+ client threads). A new member variable, daemon_threads, was added to
+ the ThreadingMixIn class in SocketServer.py to make it explicit that
+ this behavior needs to be controlled.
+
- A new module, optparse, provides a fancy alternative to getopt for
command line parsing. It is a slightly modified version of Greg
Ward's Optik package.