How to stop BaseHTTPServer.serve_forever() in a BaseHTTPRequestHandler subclass?

后端 未结 10 1194
渐次进展
渐次进展 2020-12-01 04:53

I am running my HTTPServer in a separate thread (using the threading module which has no way to stop threads...) and want to stop serving requests when the main

10条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-01 05:31

    The event-loops ends on SIGTERM, Ctrl+C or when shutdown() is called.

    server_close() must be called after server_forever() to close the listening socket.

    import http.server
    
    class StoppableHTTPServer(http.server.HTTPServer):
        def run(self):
            try:
                self.serve_forever()
            except KeyboardInterrupt:
                pass
            finally:
                # Clean-up server (close socket, etc.)
                self.server_close()
    

    Simple server stoppable with user action (SIGTERM, Ctrl+C, ...):

    server = StoppableHTTPServer(("127.0.0.1", 8080),
                                 http.server.BaseHTTPRequestHandler)
    server.run()
    

    Server running in a thread:

    import threading
    
    server = StoppableHTTPServer(("127.0.0.1", 8080),
                                 http.server.BaseHTTPRequestHandler)
    
    # Start processing requests
    thread = threading.Thread(None, server.run)
    thread.start()
    
    # ... do things ...
    
    # Shutdown server
    server.shutdown()
    thread.join()
    

提交回复
热议问题