mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Patch #550765: Add daemon_threads flag.
This commit is contained in:
		
							parent
							
								
									e0273de432
								
							
						
					
					
						commit
						f86e8ef33e
					
				
					 3 changed files with 22 additions and 1 deletions
				
			
		|  | @ -37,6 +37,14 @@ handler class.  Finally, call the \method{handle_request()} or | |||
| \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: | ||||
| 
 | ||||
|  |  | |||
|  | @ -56,7 +56,8 @@ | |||
|         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 | ||||
|  | @ -448,6 +449,10 @@ def process_request(self, request, client_address): | |||
| 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. | ||||
| 
 | ||||
|  | @ -466,6 +471,8 @@ def process_request(self, request, client_address): | |||
|         import threading | ||||
|         t = threading.Thread(target = self.process_request_thread, | ||||
|                              args = (request, client_address)) | ||||
|         if self.daemon_threads: | ||||
|             t.setDaemon (1) | ||||
|         t.start() | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -389,6 +389,12 @@ Extension modules | |||
| 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. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Martin v. Löwis
						Martin v. Löwis