2015-06-09 15 views
5

Ich verwende Flask als REST-Endpunkt, der eine Anwendung Anfrage zu einer Warteschlange hinzufügt. Die Warteschlange wird dann von einem zweiten Thread verbraucht.Python Flask shutdown Ereignishandler

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) 

Gibt es einen Shutdown-Ereignishandler in der Flasche, so dass ich kann der Verbraucher Faden sauber Abschaltung, wenn der Kolben App Abschaltung ist (wie wenn der Apache-Service ist neu gestartet)?

Antwort

8

Es gibt keine app.stop ist(), wenn das ist, was Sie suchen, aber Modul atexit Sie etwas Ähnliches tun:

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

diese Bedenken Sie:

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() 

Auch der Hinweis atexit wird nicht aufgerufen, wenn Sie den Server mit Strg-C herunterfahren.

Dafür gibt es ein anderes Modul - signal.

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

+5

Ich benutze dies und es funktioniert gut. Vielen Dank. Übrigens behandelt atexit die Ctrl C richtig – arturvt