2012-06-05 11 views
5

Ich habe diese einfache Flasche App:Flasche und Web.py hängen beide auf atexit

from flask import Flask 
import prolog_handler as p 

app = Flask(__name__) 
app.debug = False 

@app.route('/') 
def hello(): 
    for rule in p.rules: 
     print rule 
    return 'hello' 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8080) 

Das prolog_handler Modul eine Sitzung mit einem triplestore gestartet und lädt einige Regeln. Es hat auch eine atexit-Funktion, die die Sitzung beendet und eine Nachricht wie "Schließen ..." ausgibt. Ich starte den Server von der Bash-Eingabeaufforderung mit python myapp.py. Immer wenn ich STRG-C drücke, um den Server zu stoppen, passiert nichts. Ich werde nicht zur Bash-Eingabeaufforderung zurückgeleitet, und ich sehe nicht, dass die Meldung "Closing ..." gedruckt wird. Ich habe auch versucht, dies mit Web.py mit den gleichen Ergebnissen zu tun.

Der dass prolog_handler tut, ist buchstäblich so einfach wie diese:

tstore = openPrologSession() 
rules = ... 

def cleanUp(): 
    print "Closing..." 
    tstore.endSession() 

atexit.register(cleanUp) 

Warum ist es so schwierig, nur eine atexit Aufgabe ausführen?

PS: wenn ich alle Sachen über das Öffnen der Prolog Session auskommentiere und sie beende, und einfach den Teil zurücklassen, der die Nachricht "Closing ..." ausgibt, dann sehe ich die Meldung "Closing ..." wenn Ich drücke STRG-C und ich komme zur Bash-Eingabeaufforderung zurück. Das funktioniert wie erwartet. Aber was ist der Sinn von Atexit, wenn ich damit nichts anfangen kann?

Antwort

6

Dies kann nicht die perfekte Antwort, aber ich versuchte, die folgenden: Fläschchen zu verwenden:

# These functions should be called when you tear down the application 
app.teardown_functions = [] 

def teardown_applications(): 
    for func in app.teardown_functions: 
     print('Calling teardown function %s' % func.__name__) 
     func() 

app.teardown_functions.append(function_tocall_at_exit) 

Das ist für mich zu arbeiten scheint. Ich neige auch dazu, Gevent für alle Kolbenanwendungen

if __name__ == '__main__': 
    gevent.signal(signal.SIGINT, teardown_applications) 
    http_server = WSGIServer(('', 5000), app) 
    http_server.serve_forever() 

zu verwenden Das funktioniert normalerweise für mich.

Einige der Modul Importe:

from flask import Flask 
from gevent.wsgi import WSGIServer 
import gevent 
import signal 

from gevent import monkey 
monkey.patch_all() 
+0

Aha! Cooler Mann, danke! –

+0

@John Peter Thompson Garcés: Danke. Überprüfen Sie, ob dies für Sie funktioniert. – pyfunc

+0

Ja, es hat wie erwartet funktioniert! –