Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Flask shutdown event handler

I'm using Flask as a REST endpoint which adds an application request to a queue. The queue is then consumed by a second thread.

server.py

def get_application():     global app     app.debug = True     app.queue = client.Agent()     app.queue.start()                                                                                                                                                                                                                     return app  @app.route("/api/v1/test/", methods=["POST"]) def test():      if request.method == "POST":         try:            #add the request parameters to queue            app.queue.add_to_queue(req)         except Exception:             return "All the parameters must be provided" , 400      return "", 200       return "Resource not found",404 

client.py

class Agent(threading.Thread):        def __init__(self):           threading.Thread.__init__(self)           self.active = True           self.queue = Queue.Queue(0)         def run(self):            while self.active:               req = self.queue.get()               #do something         def add_to_queue(self,request):            self.queue.put(request) 

Is there a shutdown event handler in flask so that I can cleanly shutdown the consumer thread whenever the flask app is shutdown (like when the apache service is restarted)?

like image 804
Mark Avatar asked Jun 09 '15 17:06

Mark


1 Answers

There is no app.stop() if that is what you are looking for, however using module atexit you can do something similar:

https://docs.python.org/2/library/atexit.html

Consider this:

import atexit #defining function to run on shutdown def close_running_threads():     for thread in the_threads:         thread.join()     print "Threads complete, ready to finish" #Register the function to be called on exit atexit.register(close_running_threads) #start your process app.run() 

Also of note-atexit will not be called if you force your server down using Ctrl-C.

For that there is another module- signal.

https://docs.python.org/2/library/signal.html

like image 197
John Avatar answered Sep 18 '22 10:09

John